题目:分组背包
思路:
时间复杂度O(n^v)。
f[i][j]表示前i组,使用j个空间的最大价值。
f[i][j]=max(f[i-1][j],f[i][j-w[k]]+c[k])
可以滚动数组优化第一维。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxv 200
#define maxt 10
#define maxn 30
int v,n,t;
int c[maxn+5],w[maxn+5];
vector<int> g[maxt+5];
int f[maxv+5]= {0};
int main() {
scanf("%d%d%d",&v,&n,&t);
for(int i=1; i<=n; i++) {
int x;
scanf("%d%d%d",&w[i],&c[i],&x);
g[x].push_back(i);
}
for(int i=1; i<=t; i++) {
for(int j=v; j>=0; j--) {
for(int k=0; k<g[i].size(); k++) {
int x=g[i][k];
if(j-w[x]>=0) f[j]=max(f[j],f[j-w[x]]+c[x]);
}
}
}
printf("%d",f[v]);
return 0;
}