揹包 01揹包

2021-08-19 22:14:16 字數 1513 閱讀 9116

01揹包:有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight[i]與價值value[i],求解如何裝包使得價值最大。

dp(i,v)表示前i個物體(包括第i個)面對容量為v的揹包的最大價值,c[i]代表物體i的重量,w[i]代表物體i的價值;如果第i個物體不放入揹包,則揹包的最大價值等於前i-1個物體面對容量v的最大價值;如果第i個物體選擇放入,則揹包的最大價值等於前i-1個物體面對容量v-cost[i]的最大價值加上物體i的價值w[i]。

對於實現,一般採用乙個二維陣列(狀態轉移矩陣)dp[i][j]來記錄各個子問題的最優狀態,其中dp[i][j]表示前i個物體面對容量j揹包的最大價值。

下面給出0-1揹包的基本實現,時間複雜度為o(n*v),空間複雜度也為o(n*v)

#includeusing namespace std;

int dp[1005][1005];

int weight[1005];

int value[1005];

int main()

}cout《運**況用二維的表來看:

name  weight  value  1  2   3   4   5    6  7   8    9    10

a      4      6     0  0   0   6   6    6  6   6    6     6

b      5      4     0  0   0   6   6    6  6   6    10    10

c      6      5     0  0   0   6   6    6  6   6    10    11

d      2      3     0  3   3   6   6    9  9   9    10    11

e      2      6     0  6   6   9   9    12 12  15   15    15

優化:for(i=1;i<=n;i++)

}

其執行過程也是上述的二維表:

name  weight  value  1  2   3   4   5    6  7   8    9    10

a      4      6     0  0   0   6   6    6  6   6    6     6

b      5      4     0  0   0   6   6    6  6   6    10    10

c      6      5     0  0   0   6   6    6  6   6    10    11

d      2      3     0  3   3   6   6    9  9   9    10    11

e      2      6     0  6   6   9   9    12 12  15   15    15

初始化:

1.沒要求恰好裝滿memset(dp,0,sizeof(dp))

2.恰好裝滿:dp[0]=0;dp[其他]=負無窮

揹包 01揹包,完全揹包,多重揹包

哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...

01揹包 完全揹包 多重揹包

01揹包 zeroonepack 有n件物品和乙個容量為v的揹包,每種物品均只有一件。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。include include includeusing namespace std const int n 1000 10 int ...

01揹包 完全揹包 多重揹包

01揹包 zeroonepack 有n件物品和乙個容量為v的揹包。每種物品均只有一件 第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。完全揹包 completepack 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求...