分组背包和01背包十分相似,设dp[i][j]表示前i组物品放入容量为j的背包里所能获得的最大价值,则从dp[i-1][j]来得到dp[i][j] 因为可以拿一组里的任意一个,所以
循环k为每组里的物品的下标
if(第k项物品的代价大于j)
dp[i][j]=dp[i-1][j]
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[k]]+v[k])
然后这题要注意将物品,背包,组这些词转换一下就行了
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ENTER printf("\n");
using namespace std;
int n, m;
int c[10000 + 1];//存储cost代价
int v[10000 + 1];//存储value价值
int dp[100 + 1];
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
if (m == 0 && n == 0)
break;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
c[(i - 1) * m + j] = j;
scanf("%d", &v[(i - 1) * m + 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 <= m; k++)
{
if (j >= c[k])
{
dp[j] = max(dp[j], dp[j - c[(i-1)*m+k]] + v[(i - 1) * m + k]);
}
}
}
}
printf("%d\n", dp[m]);
}
return 0;
}