- 二进制优化的多重背包
采用倍增的思想把每个物品的个数用1,2,4…一直都该物品的个数,这些数可以表示这个物品的所有 物品
#include <bits/stdc++.h>
using namespace std;
const int N=25000,M=20100;
int f[M],v[N],w[N];
int main()
{
int n ,m;
cin>>n>>m;
int cnt=1;
for(int i=0;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
int t=1;
while(t<=c){
v[cnt]=t*a;
w[cnt]=t*b;
cnt++;
c-=t;
t*=2;
}
if(c>0){
v[cnt]=c*a;
w[cnt]=c*b;
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];
}
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int f[N],w[N][N],v[N][N],p[N];
int main(){
int n,m;
cin>>n>>m;
for (int i = 1; i <=n; i ++ ){
int t;
cin>>p[i];
t=p[i];
for(int j=1;j<=t;j++){
cin>>v[i][j]>>w[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){
for(int k=1;k<=p[i];k++){
if(j>=v[i][k]){
f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
}
}
cout<<f[m];
}