#include<bits/stdc++.h>usingnamespace std;constint N =110;int n, m;int v[N], s[N], w[N];int f[N][N];intmain(){
cin >> n >> m;for(int i =1; i <= n; i ++) cin >> v[i]>> w[i]>> s[i];for(int i =1; i <= n; i ++)for(int j =0; j <= m; j ++)for(int k =0; k <= s[i]; k ++){if(j >= k * v[i]) f[i][j]=max(f[i][j], f[i -1][j - k * v[i]]+ k * w[i]);}
cout << f[n][m]<< endl;system("pause");return0;}
代码优化
二进制优化的方式
把 s 分为从2的0次幂开始一直到2的k次幂 且它们相加的和X小于s
此时再添加一个常数c = s - X && c <= 2的k+1次幂
之后把从2的0次幂开始一直到2的k次幂和c,每一个都看成一组,之后用01背包的想法,就可解决该问题
优化代码
#include<bits/stdc++.h>usingnamespace std;constint N =25000, M =2010;int n, m;int v[N], w[N];int f[N];intmain(){
cin >> n >> m;int cnt =0;for(int i =1; i <= n; i ++){int a, b, s;// v, w , s
cin >> a >> b >> s;int k =1;while(k <= s){
cnt ++;
v[cnt]= a * k;
w[cnt]= b * k;
s -= k;
k *=2;}if(s >0){
cnt ++;
v[cnt]= a * s;
w[cnt]= b * s;}}
n = cnt;for(int i =1; i <= n; i ++)for(int j = m; j >= v[i]; j --)
f[j]=max(f[j], f[j - v[i]]+ w[i]);
cout << f[m]<< endl;
system ("pause");}