题意:
就是一个多重背包,但是数据量有所增加,使得从前的nm^2复杂度已经解决不了这个问题了。
分析:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 25010,M = 2010;
int f[M];
int v[N],w[N];
int main(){
int n,m;
scanf("%d%d",&n,&m);
int cnt = 1;
for(int i=1;i<=n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int k = 1;
while(k <= c){
v[cnt] = k*a;
w[cnt] = k*b;
cnt++;
c -= k;
k <<= 1;
}
if(c > 0){
v[cnt] = c*a;
w[cnt] = c*b;
cnt++;
}
}
cnt--;
for(int i=1;i<=cnt;i++){
for(int j=m;j>=v[i];j--){
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}