思路:利用二进制对背包的个数进行优化
c++实现:
#include<iostream>
#include<algorithm>
using namespace std;
int m,n;
const int N=20100;
int v[N],w[N];
int f[N];
int main(){
cin>>m>>n;
int a,b,c,cnt=0;
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
int k=1;
while(k<=c){
cnt++;
v[cnt]=a*k;
w[cnt]=b*k;
c-=k;
k*=2;
}
if(c>0){
cnt++;
v[cnt]=a*c;
w[cnt]=b*c;
}
}
m=cnt;
for(int i=1;i<=m;i++)
for(int j=n;j>=v[i];j--)
f[j]=max(f[j-v[i]]+w[i],f[j]);
cout<<f[n];
}