所有背包思想来自闫总的ACWing
题目链接:https://www.acwing.com/problem/content/4/
朴素算法:
#include<iostream>
using namespace std;
int N,V;
int dp[3000];
int main(){
cin>>N>>V;
int v,w,s;
for(int i=0;i<N;i++){
cin>>v>>w>>s;
for(int j=V;j>=0;j--){
for(int k=1;k*v<=j&&k<=s;k++){
dp[j]=max(dp[j],dp[j-k*v]+k*w);
}
}
}
cout<<dp[V]<<endl;
return 0;
}
二进制优化算法:
①把一个数x分解为:1+2+4+…+(x-1-2-4) 括号内数值大于0
②多重背包——>化为01背包问题
/*
多重背包的二进制优化
二进制优化
1+2+4+...+(n-1-2-4-...)
*/
#include<iostream>
#include<vector>
using namespace std;
struct Good{
int v,w;
};
int dp[20020];
vector<Good>goods;
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
int v,w,s;
cin>>v>>w>>s;
for(int k=1;s>=k;k*=2){
s-=k;
goods.push_back({k*v,k*w});
}
if(s>0)goods.push_back({s*v,s*w});
}
for(auto good: goods)
for(int j=m;j>=good.v;j--)
dp[j]=max(dp[j],dp[j-good.v]+good.w);
cout<<dp[m]<<endl;
return 0;
}