E16 背包DP 分组背包
视频链接:https://www.bilibili.com/video/BV16a411w77X/
// 分组背包 朴素算法 #include<iostream> #include<cstring> using namespace std; const int N=110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N][N]; // f[i,j]:前i组物品,能放入容量为j的背包的最大值 int main(){ int n,V; cin>>n>>V; for(int i=1;i<=n;i++){ cin>>s[i]; for(int j=1;j<=s[i];j++) cin>>v[i][j]>>w[i][j]; } for(int i=1;i<=n;i++) //物品组 for(int j=1;j<=V;j++) //体积 for(int k=0;k<=s[i];k++) //同组内的物品只能选一个 if(j>=v[i][k]) f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]); cout<<f[n][V]; }
// 分组背包 朴素算法 空间优化 #include<iostream> #include<cstring> using namespace std; const int N=110; int f[N],v[N],w[N]; int main(){ int n,V,s; cin>>n>>V; for(int i=1;i<=n;i++){ //物品组 cin>>s; for(int j=1;j<=s;j++) cin>>v[j]>>w[j]; for(int j=V;j>=1;j--) //体积 for(int k=0;k<=s;k++) //个数 if(j>=v[k]) f[j]=max(f[j],f[j-v[k]]+w[k]); } cout<<f[V]; }
#include<iostream> #include<cstring> using namespace std; const int N=1010; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N]; // f[i,j]:前i组物品,能放入容量为j的背包的最大值 int main(){ int n,V,a,b,c,mx=0; cin>>V>>n; for(int i=1;i<=n;i++){ cin>>a>>b>>c; v[c][++s[c]]=a; w[c][s[c]]=b; mx=max(mx,c); } for(int i=1;i<=mx;i++) //组 for(int j=V;j>=1;j--) //体积 for(int k=0;k<=s[i];k++) //个数 if(j>=v[i][k]) f[j]=max(f[j],f[j-v[i][k]]+w[i][k]); cout<<f[V]; }
Luogu P1064 [NOIP2006 提高组] 金明的预算方案
#include<iostream> using namespace std; const int N=33000; int n,W,v,p,q; int mw[N],mv[N],fw[N][3],fv[N][3]; int f[N]; int main(){ cin>>W>>n; //W总重量,n总个数 for(int i=1;i<=n;i++){ cin>>v>>p>>q; if(!q){ mw[i]=v; //主件重量 mv[i]=v*p; //主件价值 } else{ fw[q][0]++; //附件个数 fw[q][fw[q][0]]=v; //fw附件重量 fv[q][fw[q][0]]=v*p; //fv附件价值 } } for(int i=1;i<=n;i++) //物品 for(int j=W;j>=mw[i];j--){ //体积 f[j]=max(f[j],f[j-mw[i]]+mv[i]); //只选m if(j>=mw[i]+fw[i][1]) //选m,a f[j]=max(f[j],f[j-mw[i]-fw[i][1]]+mv[i]+fv[i][1]); if(j>=mw[i]+fw[i][2]) //选m,b f[j]=max(f[j],f[j-mw[i]-fw[i][2]]+mv[i]+fv[i][2]); if(j>=mw[i]+fw[i][1]+fw[i][2]) //选m,a,b f[j]=max(f[j],f[j-mw[i]-fw[i][1]-fw[i][2]]+mv[i]+fv[i][1]+fv[i][2]); } cout<<f[W]; }