5. 多重背包问题 II
题目链接https://www.acwing.com/problem/content/5/
题目:
思路:通过二进制对个数进行优化,让n->logn
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[2010],w[12000],v[12000],k;
int main(){
int n,m;
cin>>n>>m;
int x,y,s;
for(int i=0;i<n;i++){
scanf("%d%d%d",&x,&y,&s);
int ct=1;
while(ct<=s){
v[k]=x*ct;
w[k++]=y*ct;
s-=ct;
ct*=2;
}
if(s){
v[k]=x*s;
w[k++]=y*s;
}
}
for(int i=0;i<k;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m];
return 0;
}