http://acm.hdu.edu.cn/showproblem.php?pid=1712
题意:有n门课程和m天的时间,输入一个矩阵a[i][j], 表示花费 j 天去完成第 i 门课程可以得到 a[i][j] 的价值,要你求最大价值,
思路:因为一门课程可以选择1,2,3,…,m天完成,所以可以看作是一个分组背包,转移方程:
for 所有的组k
for v=V..0
for 所有的i属于组k
f[v]=max{f[v],f[v-c[i]]+w[i]}
具体代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n, m;
int dp[105];
int mapn[105][105];
int main()
{
while(cin>>n>>m && (n || m)){
for(int i = 1; i <= n; i++){
for(int k = 1; k <= m; k++){
cin>>mapn[i][k];
}
}
memset(dp, 0, sizeof(dp));
//前i门课程
for(int i = 1; i <= n; i++){
//一共有k天时间
for(int k = m; k > 0; k--){
//花费h天时间
for(int h = 1; h <= k; h++){
if(dp[k] < dp[k - h] + mapn[i][h]){
dp[k] = dp[k - h] + mapn[i][h];
}
}
}
}
cout<<dp[m]<<endl;
}
return 0;
}