当前位置:编程学习 > C/C++ >>

HDU 1712 ACboy needs your help 多组背包

题意:用m天的时间来学n门课程,给出n和m和一个num[n][m]的矩阵,num[n][m] 代表的是花m天的时间学习第n门课程所获得的价值,求最多能获得多大的价值
思路:将天数m作为背包的总体积,科目数目作为背包的种类数目,天数j作为背包的重量,num[i][j]作为背包的价值。由于一个科目只能选一次,即满足一组背包只能选一个,即转化为多组背包问题。www.zzzyk.com
代码:
[cpp] 
#include <iostream> 
#include <string.h> 
#include <cstdio> 
using namespace std; 
 
#define CLR(arr,val) memset(arr,val,sizeof(arr)) 
const int N = 110; 
int num[N][N],dp[N]; 
struct course{ 
    int val,weight; 
}cc[110]; 
int main(){ 
    //freopen("1.txt","r",stdin); 
    int numkind,totalweight; 
    while(scanf("%d%d",&numkind,&totalweight) &&numkind&&totalweight){ 
       CLR(num,0); 
       int x; 
       for(int i = 1;i <= numkind;++i){ 
           for(int j = 1;j <= totalweight;++j){ 
             scanf("%d",&num[i][j]); 
           } 
       } 
       CLR(dp,0); 
       for(int i = 1;i <= numkind;++i){ 
           for(int w = totalweight;w > 0;--w){ 
               for(int j = 0;j <= totalweight;++j){ 
                   if(w >= j) 
                      dp[w] = max(dp[w],dp[w - j] + num[i][j]); 
               } 
           } 
       } 
       int mmax = 0; 
       for(int i = 0;i <= totalweight;++i) 
           if(mmax < dp[i]) 
               mmax = dp[i]; 
       printf("%d\n",mmax); 
    } 
    return 0; 

作者:wmn_wmn
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,