【洛谷】分组背包 P1757 通天之分组背包
题目大意
现在有 \(n\) 个物品,每个物品有三个属性 \(w,v,id\),分别表示这个物品的 重量 价值 以及所属的组。
给出容量为 \(m\) 的背包,同一个组的物品最多取一个,问可以取得的最大值。
题解
分组背包模板题。
注意:先枚举背包容量,再枚举同一个组中的物品
代码
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int seed=233;
const int N=1e3+10;
vector<pair<int,int>>vec[N];
int dp[N];
int main()
{
int n,m;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
vec[c].pb(make_pair(a,b));
}
for(int i=1;i<=n;i++){
if(!vec[i].size()) continue;
for(int j=m;j>=0;j--){
for(int k=0;k<vec[i].size();k++){
if(j>=vec[i][k].first)
dp[j]=max(dp[j],dp[j-vec[i][k].first]+vec[i][k].second);
}
}
}
printf("%d\n",dp[m]);
return 0;
}