一维分组背包已过,但是我想深入理解其中原理。因此按照自己的理解写了一遍二维分组背包,一直WA#5,因此求助WA#5
#include <bits/stdc++.h>
using namespace std;
int dp[105][1005]; //前i组容量为j的最大价值
int w[105][1005],v[105][1005]; //i组第j个商品的重量、价值
int cnt[105]; //i组有多少个商品
int main()
{
int m,n; cin>>m>>n;
int sum = 0; //一共有多少个组
for(int i = 1; i <= n; i++)
{
int a,b,c; cin>>a>>b>>c;
if(!cnt[c]) sum++;
w[c][cnt[c]] = a;
v[c][cnt[c]] = b;
cnt[c]++;
}
for(int i = 1; i <= sum; i++) //遍历第i组
{
for(int j = 0; j <= m; j++) //遍历容量j
{
for(int k = 0; k < cnt[i]; k++) //遍历第i组的第k个商品
{
//与"加入本组的当前商品"、"之前加入的本组商品"、"不加入本组商品"相比较
if(j >= w[i][k]) dp[i][j] = max(dp[i][j],max(dp[i - 1][j],dp[i - 1][j - w[i][k]] + v[i][k]));
else dp[i][j] = max(dp[i][j],dp[i - 1][j]);
}
}
}
cout<<dp[sum][m];
return 0;
}