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