【動態規劃】--01揹包問題
阿新 • • 發佈:2018-12-21
o1揹包問題:一個揹包體積為V, 現有n個物品,第i個物品體積為w[i],價值為c[i]。問在不超出揹包 容量前提下,揹包 最多能裝下多少價值的物品。
之所以叫01揹包是因為這類題都可以歸結為第i個物品 放還是不放問題。這裡用二維陣列表示(當然也可用一維)
若第i個物品放的話 f[i][v]=f[i-1][v-w[i]]+c[i](i表示第幾個物品,v表示重量)
若不放的話f[i][v]=f[i-1][v]
轉換方程:f[i][v] = max(f[i-1][v], f[i-1][v-w[i]]+c[i])
下面分別是二維和一維陣列模板
#include<bits/stdc++.h> #define M 100000 int w[M]; int v[M]; int f[M][M]; using namespace std; int main(){ int t,m; cin>>t>>m; memset(f,0,sizeof(f)); for(int i=1;i<=m;i++) cin>>w[i]>>v[i]; for(int i=1;i<=m;i++) { for(int j=0;j+w[i]<=t;j++) f[i][j]=max(f[i-1][j],f[i-1][j+w[i]]+v[i]); } int maxs=0; for(int i=0;i<=t;i++) maxs=max(f[m][i],maxs); cout<<maxs<<endl; return 0; }
#include<bits/stdc++.h> #define M 100000 int w[M]; int v[M]; int f[M]; using namespace std; int main(){ int W,m; memset(f,0,sizeof(f)); cin>>W>>m; for(int i=1;i<=m;i++) cin>>w[i]>>v[i]; for(int i=1;i<=m;i++) for(int j=W;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+v[i]); cout<<f[W]<<endl; return 0; }