完全背包
阿新 • • 發佈:2017-09-10
tex esp ide 方程 .cn -a alt 完全 相關
完全背包
分析:
解決完全背包遊兩個思路
1、利用單維數組前面結果後後面結果的影響從而實現每樣物品取多件的效果
2、利用分組背包的思想,枚舉每個物品取1->k件的效果
1、完全背包(單數組優化)
1 //f[j]表示前i件物品花費j元的最大價值 2 //f[j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]) 3 //f[j]=0 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 int f[105]; 8 int m,n; 9 int w[105],c[105]; 10 11 int main(){完全背包(單數組優化)12 freopen("in2.txt","r",stdin); 13 //初始化dp 14 memset(f,0,sizeof(f)); 15 cin>>m>>n; 16 for(int i=1;i<=n;i++){ 17 cin>>w[i]>>c[i]; 18 } 19 20 21 for(int i=1;i<=n;i++){ 22 for(int j=1;j<=m;j++){ 23 if(j>=w[i]){ 24 f[j]=max(f[j],f[j-w[i]]+c[i]); 25 } 26 } 27 } 28 cout<<f[m]<<endl; 29 30 return 0; 31 }
2、完全背包(分組背包單數組優化)
k是在狀態轉移方程裏面的
j的向前或者是向後只和維數相關
1 //f[j]表示前i件物品花費j元的最大價值 2 //f[j]=max(f[j],f[j-w[i]*k]+c[i]*k); 3 //f[j]=0完全背包(分組背包單數組優化)4 5 #include <bits/stdc++.h> 6 using namespace std; 7 int f[105]; 8 int m,n; 9 int w[105],c[105]; 10 11 12 int main(){ 13 freopen("in2.txt","r",stdin); 14 //初始化dp 15 memset(f,0,sizeof(f)); 16 cin>>m>>n; 17 for(int i=1;i<=n;i++){ 18 cin>>w[i]>>c[i]; 19 20 } 21 22 23 //k是在狀態轉移方程裏面的 24 //j的向前或者是向後只和維數相關 25 26 for(int i=1;i<=n;i++){ 27 for(int j=m;j>=1;j--){ 28 int num=m/w[i]; 29 for(int k=1;k<=num;k++){ 30 if(j>=w[i]*k){ 31 f[j]=max(f[j],f[j-w[i]*k]+c[i]*k); 32 } 33 } 34 } 35 } 36 cout<<f[m]<<endl; 37 38 return 0; 39 } 40 41 42 //單數組 43 //可以邊讀入邊動態規劃麽 44 //01背包的分組背包 45 //01背包的分組背包的一維數組優化
完全背包