01背包
二维
//二维 #include<iostream> #include<cmath> using namespace std; const int N=1010; int p[N][N]={0}; int v[N];int w[N]; int m,n; int main() { cin>>n>>m; for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } //遍历的顺序可以变更,不限制 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ p[i][j]=p[i-1][j];//这一步不要忘记 if(j>=v[i]) p[i][j]=max(p[i-1][j],p[i-1][j-v[i]]+w[i]); } } cout<<p[n][m]<<endl; return 0; }
一维
#include<iostream> #include<cmath> using namespace std; const int N=1010; int p[N]={0}; int v[N];int w[N]; int m,n; int main() { cin>>n>>m; for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } for(int i=1;i<=n;i++){ for(int j=m;j>=v[i];j--){ p[j]=max(p[j],p[j-v[i]]+w[i]);//每次更新后结果是此次最优解,并不是最终结果,下次求则利用这结果更新 } } cout<<p[m]<<endl; return 0; }
完全背包
二维
#include<iostream> #include<algorithm> using namespace std; const int N=1010; int n,m; int v[N],w[N];int p[N][N]={0}; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){//正序即可 p[i][j]=p[i-1][j]; if(j>=v[i]) p[i][j]=max(p[i][j],p[i][j-v[i]]+w[i]);//注意是最新更新的最优解,而不是上一行最优解,因为可以重复利用 } } cout<<p[n][m]<<endl; return 0; }
一维
#include<iostream> #include<algorithm> using namespace std; const int N=1010; int n,m; int v[N],w[N];int p[N]={0}; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++){ for(int j=v[i];j<=m;j++){//正序即可 p[j]=max(p[j],p[j-v[i]]+w[i]);//注意是最新更新的最优解,而不是上一行最优解,因为可以重复利用 } } cout<<p[m]<<endl; return 0; }
多重背包朴素写法
#include<iostream> using namespace std; const int N=1010; int v[N],w[N],s[N];int p[N][N]={0}; int main() { int n,m; 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=1;j<=m;j++) for(int k=0;k<=s[i];k++){ //p[i][j]=p[i-1][j];没有这一步,因为枚举个数时就可能更新成更优解了 if(j>=v[i]*k) p[i][j]=max(p[i][j],p[i-1][j-v[i]*k]+w[i]*k); } cout<<p[n][m]<<endl; return 0;
二进制优化版
#include<iostream> #include<algorithm> using namespace std; const int N=25000,M=2010; int v[N],w[N];int p[M]; int n,m; int main() { cin>>n>>m;int cnt=0; for(int i=1;i<=n;i++){ int a,b,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--) p[j]=max(p[j],p[j-v[i]]+w[i]); cout<<p[m]<<endl; return 0; }
标签:main,背包,const,int,namespace,using,include,规划,动态 From: https://www.cnblogs.com/daimazhishen/p/17817651.html