分组背包裸体
分组背包和普通01背包的区别就是分组背包最外层为枚举的是组数(01背包是物品数),然后在最内层枚举的是枚举各组中物品的序号,这样每个体积下,每种物品只会选择一个价值最大的。idx数组是将最组中每个物品的序号记录下来。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int dp[1010],a[1010],b[1010],c[1010],num[110],idx[110][110];
int main(){
int m,n,cnt=0;
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
cnt=max(cnt,c[i]);
num[c[i]]++;
idx[c[i]][num[c[i]]]=i;
}
for(int i=1;i<=cnt;i++){
for(int j=m;j>=0;j--){
for(int k=1;k<=num[i];k++){
if(j>=a[idx[i][k]])
dp[j]=max(dp[j],dp[j-a[idx[i][k]]]+b[idx[i][k]]);
// cout<<j<<" "<<dp[j]<<endl;
}
}
// cout<<endl;
}
cout<<dp[m]<<endl;
}