揹包問題總結

2021-08-23 12:37:37 字數 984 閱讀 9142

n件物品,v容量,每件物品的代價v[i],價值w[i]

01揹包

每種物品只能取乙個,

for i: 1 to n

for j : v to v[i]

f[j] = f[j-v[i]] + w[i];

完全揹包

每種物品可以取無限個,但是體積不能超過v,

for i: 1 to n

for j = v[i] to v

f[j] = f[j-v[i]] + w[i];

多重揹包

每種物品可以取有限個,講每種物品,按照個數,分成k種物品,如 13可以拆分成1,2,4,6   、 20可以拆成1,2,4,8,5。

體積和價值分別乘以相應的倍數,進而轉化為01揹包問題。

二維揹包

n件物品,最大容量v,代價x

第i件物品所需的容量為c[i],代價為w[i],價值為a[i]

每件物品只能取一次,,在不超過容量v和代價x的情況下,求最大價值  

f[i][j][k]:前i件物品,占用j容量,代價為k時,所能獲得的最大價值

for i: 1 to n

for j : 0 to v

for k : 0 to x

f[i][j][k] = max

需要輸出方案

如果要輸出方案,不可化為一維,仍要保留 i 、j、k。

如果物品數較少,直接用dfs 暴力搜尋方案。

分組揹包

對於每個組而言,取其中一件或者不取,f[k][v]=max

for(int i=1;i<=n;i++)///共n個組

for(int v=v;v>=0;v--)///每種體積

for(int j=1;j<=m;j++)///該組的每個元素

f[v]=max(f[v],f[v-c[i]]+w[i]);

更新中

揹包問題 01揹包總結

寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,只要懂了這個圖,我想01揹包就不成問題了。首先要明確這張表是至底向上,從左到右生成的。關於01揹包的題目暫時整理了一點。1.簡單01揹包...

揹包問題總結

標籤 acm dp 揹包 n 物品,乙個揹包,每個物品價值wi 體積vi 揹包容量 c 求最大價值 對於物品 i可選可不選 fi j fi 1 j vi j 0 fi j max c j vi 給定 n 種物品和乙個揹包。第 i種物品的價值是 wi 其體積為vi 揹包的容量為 c 同一種物品的數量無...

揹包問題總結

揹包問題主要是分為三種 0 1揹包,完全揹包,多重揹包 1 0 1揹包 定義 何謂0 1揹包,可以這樣想,那裡有一堆值錢的東西,每一樣東西只有一件,他們的價值和體積都不一樣,現在要你從這n件裡面挑選一些放到乙個容量一定的揹包裡面,使得你的揹包裡的東西總價值最大。對於這些東西的每一件,你可以選擇放進你...