通天之分组背包
题目背景
直达通天路·小 A 历险记第二篇
题目描述
自 01 背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。
## 输入格式
两个数 m,n,表示一共有 n件物品,总重量为 m。
接下来 n 行,每行 3个数 ai,bi,ci,表示物品的重量,利用价值,所属组数。
输出格式
一个数,最大的利用价值。
样例 1
样例输入 1
```
45 3
10 10 1
10 5 1
50 400 2
```
样例输出 1
```
10
```
提示
1<=m,n<=1000,1<=k<=100,ai,bi,ci都在int的范围内
//只需转换为分组背包即可
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N];
int v[N][N],w[N][N];
int s[N];
int ans[N];
unordered_set<int> p;
int main()
{
int n,m;
cin>>m>>n;
for (int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
p.insert(c);
s[c]++;
v[c][s[c]]=a;
w[c][s[c]]=b;
}
int cnt=1;
for (auto i:p)
{
ans[cnt++]=i;
}
cnt--;
n=cnt;
for (int i=1;i<=n;i++)
for (int j=m;j>=0;j--)
for (int k=0;k<=s[i];k++)
if (v[i][k]<=j) f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);
cout<<f[m];
return 0;
}