hdu1712 ACboy needs your help 分组背包

/**
题目:hdu1712 ACboy needs your help
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712
题意:有n门课程,最多m天学习。 给定A[i][j]表示第i门课程学习了j天会获得的学习能量;
求学完m天后可以获得的最多学习能量。
思路:分组背包
每一门课程为一组。组内物品m个。每个物品费用为j,价值为A[i][j];
每一组要么一个物品不选,要么只能选某一个物品。
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int, int> P;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int maxn = 500;
int dp[104], w[104][104];
int main()
{
    int n, m;
    while(scanf("%d%d",&n,&m)==2)
    {
        if(n+m==0) break;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                scanf("%d",&w[i][j]);
            }
        }
        ms(dp,0);
        for(int i = 1; i <= n; i++){
            for(int j = m; j >= 1; j--){
                for(int k = 1; k <= m; k++){
                    if(j>=k)
                        dp[j] = max(dp[j],dp[j-k]+w[i][k]);
                }
            }
        }
        cout<<dp[m]<<endl;

    }
    return 0;
}
原文地址:https://www.cnblogs.com/xiaochaoqun/p/7384552.html