1. 程式人生 > >0-1背包問題_動態規劃

0-1背包問題_動態規劃

依次 代碼 style 解題思路 sizeof mem 思想 div 容量

普通背包問題可以用貪心來解決,而0-1背包問題只能靠動態規劃來做,而且在我們平時的做題中經常會遇到0-1背包問題的變形,所以有必要牢牢掌握0-1背包問題的思想和解題思路。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

根據下面的圖更可以找到應該選那些背包

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

下面是我根據此思路模擬的代碼

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int array3[100];//價值
 4 int array1[100];//物品重量
 5 int capacity;//容量
 6  int n;//物品個數
 7  int array4[100]={0
};//記錄裝那些物品 8 int array2[100+1][100+1];//最大價值數組 9 int V(int n,int array1[],int array3[]){ 10 for(int i=0;i<=n;i++){ 11 array2[i][0]=0; 12 } 13 for(int j=0;j<=capacity;j++){ 14 array2[0][j]=0; 15 } 16 for(int i=1;i<=n;i++){ 17 for(int j=1;j<=capacity;j++){ 18 if
(j<array1[i]){ 19 array2[i][j]=array2[i-1][j]; 20 } 21 else{ 22 array2[i][j]=max(array2[i-1][j],array2[i-1][j-array1[i]]+array3[i]); 23 } 24 } 25 } 26 int m=capacity; 27 for(int i=n;i>0;i--){ 28 if(array2[i][m]>array2[i-1
][m]){//記錄路徑1為裝入該物品 29 array4[i]=1; 30 m=m-array1[i]; 31 } 32 } 33 return array2[n][capacity]; 34 } 35 int main() 36 { 37 cout << "請輸入不同物品的總個數(每個物品都不相同,即該類物品只有一個)"; 38 cin >> n; 39 cout << "請依次輸入物品的重量" << endl; 40 memset(array1,0,sizeof(array1)); 41 for(int i=1;i<=n;i++){ 42 cin >> array1[i] ; 43 } 44 cout << "請依次輸入物品的價值" << endl; 45 memset(array3,0,sizeof(array3)); 46 for(int i=1;i<=n;i++){ 47 cin >> array3[i] ; 48 } 49 cout << "請輸入背包的總容量"; 50 cin >> capacity; 51 memset(array2,0,sizeof(array2)); 52 cout << "可獲的最大價值" << V(n,array1,array3) << endl; 53 cout << "需要裝入的物品是:"; 54 for(int i=1;i<=n;i++){ 55 if(array4[i]==1){ 56 cout <<"物品"<< i << " "; 57 } 58 } 59 return 0; 60 }

運行結果如下

技術分享圖片

總結:(1)很多0-1背包問題完全可以套此模板快速解決問題.(2)時間復雜度為o^n2。

0-1背包問題_動態規劃