完全揹包,0 1揹包實戰

2021-10-23 02:01:37 字數 1028 閱讀 8893

0-1揹包

淺解:就是必須將揹包裝滿

原題摘錄

簡要解析

顯然,這是乙個完全揹包問題.問題就是挑選物品,把總體積湊成40有多少種湊法?列舉顯然不行.因為列舉每個物品選還是不選,有2^20種.

先可以嘗試使用遞迴的思想.遞迴是很多思想的乙個起點.也最容易想到.以及從他出發優化出更好的辦法.

把ways(int w,int k)表示為從前k種物品湊成體積為w的湊法總數,那我們要求的不就是ways(40,n),n為輸入的物品種數.

int ways

(int w,int k)

進一步轉化為記憶型動歸,顯然這裡有兩個變數,故用二維陣列ways[w][k];

int main()

ways[0]

[0]=

1;for(int w=

1;w<=

40;w++)}

cout<

[n];

return0;

}

淺解:揹包容量可以有剩餘,東西要麼拿,要麼不拿.原題摘錄

n 個物品每個物品有價值d[i],重量w[i], 給定揹包最大承重m,求揹包能夠裝載的最大價值。每個物品只有放入揹包和不放入揹包兩種選擇。

簡要解析

同上題:

我們用f[i][j]表示取前i種物品,總體積不超過j的最優取法的價值總和.

同樣可以轉化為記憶型動歸:(取還是不取第i種)

f[i][j]=max

但是,可以發現,若總體積很大時,二維陣列就要開的很大,最終導致記憶體不夠.

注意到了這個二維陣列的下一行的值,只用到了上一行的正上方及左邊的值,因此可以採用滾動陣列的思想,只要一行即可.所以,可以使用一維陣列,遞推型動歸實現.

int n, m;

//物品數,揹包容量

while

(cin >> n >> m)

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...

01揹包 完全揹包

本文主要使用一維陣列進行使用 意思 01揹包 代表物品只有兩種狀態,只能使用一次。如,dp i max dp i dp i wight j value j 代表容量為i所獲得的最大利潤。完全揹包 乙個物品可以使用無限次 技巧 1.如果是0 1揹包,即陣列中的元素不可重複使用,nums放在外迴圈,ta...

揹包 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 重量 花...