hdu 1712(分组背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712

思路:这是一道简单的分组背包,因为每种课可以有多种选择:花几天时间在该课上。一旦作出选择,就不能再选该课,就相当于有多组物品,每组内的物品互相冲突,最多只能选一件。

伪码:

for 所有的组k

    for v=V..0

        for 所有的i属于组k

            f[v]=max{f[v],f[v-c[i]]+w[i]}

View Code
 1 #include<iostream>

 2 const int MAXN=110;

 3 using namespace std;

 4 int dp[MAXN];

 5 int map[MAXN][MAXN];

 6 

 7 int main(){

 8     int n,m;

 9     while(~scanf("%d%d",&n,&m)){

10         if(n==0&&m==0)break;

11         for(int i=1;i<=n;i++){

12             for(int j=1;j<=m;j++){

13                 scanf("%d",&map[i][j]);

14             }

15         }

16         memset(dp,0,sizeof(dp));

17         for(int i=1;i<=n;i++){

18             for(int j=m;j>=1;j--){

19                 for(int k=1;k<=m;k++){

20                     if(j-k>=0){

21                         dp[j]=max(dp[j],dp[j-k]+map[i][k]);

22                     }

23                 }

24             }

25         }

26         printf("%d\n",dp[m]);

27     }

28     return 0;

29 

30 }

 

你可能感兴趣的:(HDU)