程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDOJ 1712 ACboy needs your help(分組0/1背包)

HDOJ 1712 ACboy needs your help(分組0/1背包)

編輯:C++入門知識

把同一門考試當成一組,在一門考試裡,花的天數和考的成績分別是組內物品的代價和價值,這樣就轉化成一個分組的0/1背包的問題。

 \


AC程序:

 


[cpp]
/*HDOJ1712
作者:陳佳潤
2013-04-19
*/ 
#include<iostream>  
using namespace std; 
#include<string.h>  
#define max(a,b) (a>b?a:b)  
int groud[105]; 
int dp[105]; 
int m; 
void ZeroOnePack(){ 
    int k,i; 
    for(i=m;i>0;i--){//對於每一個天數  
        for(k=1;k<=m;k++){//對於組內每一個物品  
            if(i>=k) 
                dp[i]=max(dp[i],dp[i-k]+groud[k]); 
        } 
    } 

 
int main(){ 
    int n,i,j; 
    //freopen("1.txt","r",stdin);  
    while(cin>>n>>m&&(n!=0||m!=0)){ 
        memset(dp,0,sizeof(dp)); 
        for(i=1;i<=n;i++){//對於每一門考試  
            for(j=1;j<=m;j++){ 
                cin>>groud[j]; 
            } 
            ZeroOnePack(); 
        } 
        cout<<dp[m]<<endl; 
    } 
    return 0; 

/*HDOJ1712
作者:陳佳潤
2013-04-19
*/
#include<iostream>
using namespace std;
#include<string.h>
#define max(a,b) (a>b?a:b)
int groud[105];
int dp[105];
int m;
void ZeroOnePack(){
 int k,i;
 for(i=m;i>0;i--){//對於每一個天數
  for(k=1;k<=m;k++){//對於組內每一個物品
   if(i>=k)
    dp[i]=max(dp[i],dp[i-k]+groud[k]);
  }
 }
}

int main(){
 int n,i,j;
 //freopen("1.txt","r",stdin);
 while(cin>>n>>m&&(n!=0||m!=0)){
  memset(dp,0,sizeof(dp));
  for(i=1;i<=n;i++){//對於每一門考試
   for(j=1;j<=m;j++){
    cin>>groud[j];
   }
   ZeroOnePack();
  }
  cout<<dp[m]<<endl;
 }
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved