知识点:01背包循环的是物品个数,而分组背包则是将这一个循环拆成两个循环,分别循环组数和组中的物品个数。分组背包把一堆物品放在一个小组中间,每个小组只能选择其中一个物品。
#include <iostream>
#include <cmath>
using namespace std;
//物品个数,总重量
int n,m;
//第几组的第几个物品的重量/价值
int weight[1005][1005],value[1005][1005];
//记录每组物品的个数
int num[1005];
//状态保存
int dp[1005];
int main(){
//初始化
cin>>m>>n;
for(int i=1;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
weight[c][++num[c]]=a;
value[c][num[c]]=b;
}
//状态转移
//组数
for(int i=1;i<=n;i++){
//重量
for(int j=m;j>=0;j--){
//详细物品信息
for(int k=1;k<=num[i];k++){
if(weight[i][k]<=j){
dp[j]=max(dp[j],dp[j-weight[i][k]]+value[i][k]);
}
}
}
}
cout<<dp[m];
}