题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1712
题意:
有n个课,要求在m天内学完。每个课学习不同的天数(1~m)会得到不同的利益,每个课只能学习一次,求最大利益
思路:
分组背包裸题。把每个课看做一个分组,学习的天数作为花费,所得到的利益作为价值,就可以套用背包了,定义dp[i][j]为前i个分组花费j天所获得的最大利益,状态转移方程为dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost] + val),其中cost<=j
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int main()
{
int n, m;
int a[N][N], dp[N];
while(scanf("%d%d", &n, &m), n || m)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
memset(dp, 0, sizeof dp);
for(int i = 1; i <= n; i++)
for(int j = m; j >= 1; j--)
for(int k = 1; k <= j; k++)
dp[j] = max(dp[j], dp[j-k] + a[i][k]);
printf("%d\n", dp[m]);
}
return 0;
}