0 1揹包問題(動態規劃) 解題報告

2021-08-25 09:05:50 字數 1149 閱讀 4183

利用動態規劃,以自底向上的方式解各子問題。

解題思路:

此問題可轉化為:給定c>0,wi>0,vi>0,1≤i≤n,要求找出一

個n元0-

1向量(x1,x2,…,xn),xi∈

,1≤i≤n,使得∑wixi≤c,而且

∑vixi達到最大。因此,0-1揹包是乙個特

殊的整數規劃問題:

max ∑vixi

s.t. ∑wixi≤c

xi∈,1≤i≤n

**如下:

code:

#include

#include

#include

using

namespacestd;

intmin(intw,intc)//取較小值

intmax(intw,intc)//取較大值

voidknapsack(intv,intw,intc,intn,int**m)

m[1][c]=m[2][c];//對第乙個物品進行處理

if(c>=w[1])

m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);

cout<<"最優解:"

<}

voidprint_case(int**m,intw,intc,intn,intx)//輸出物品存放的情況

x[n]=(m[n][c])?1:0;

for(inty=1;y<=n;y++)

cout}voidmain()

knapsack(v,w,c,n,m);

print_case(m,w,c,n,x);}

動態規劃之01揹包詳解 解題報告

01揹包問題,是用來介紹動態規劃演算法最經典的例子,網上關於01揹包問題的講解也很多,我寫這篇文章力爭做到用最簡單的方式,最少的公式把01揹包問題講解透徹。f i,j 表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。pi表示第i件物品的價值。決策 為了揹包中物品總價值最大化...

解題報告 01揹包

這應該是最基礎的揹包問題了,但正因為他的基礎,他的思想會被用在很多dp題中,所以這裡有必要對他剖析一下。我們應該掌握的方法有兩種 1 二維陣列。2 滾動陣列。後面那個一看就要高階一些,但是確實對動歸沒有太大的幫助,所以大家一定要把第一種方法學好!第二種方法我不做解釋,只會黏貼 大家認真腦補一下應該也...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...