0 1揹包之 動態規劃解法

2021-10-05 22:37:26 字數 1274 閱讀 6711

給定n種物品和一揹包,揹包的載重量為c 。設物品i的重量是wi,其價值為pi。每件物品要麼整體裝入揹包,要麼不裝,不能拆開裝。問應如何選擇裝入揹包的物品,使得裝入揹包中的物品的總重量不超過c、總價值最大?

建立數學模型:

可用xi表示第i個物品是否裝入揹包: xi =1,表示裝入 ; xi =0,表示不裝入。乙個裝包方案表示為乙個n維向量:(x1,x2,…, xn)

2.考慮0-1揹包問題的子問題:揹包容量為j,可選物品的範圍為:i,i+1,…,n 。其最優值定義 為:m(i,j),可知:原問題的最優值為m(1,c)

求解m(i,j)演算法如下:

若j=wi, 取如下二種情形的最大值:

不裝:m(i,j)= m(i+1,j)

裝入:m(i,j)= m(i+1,j- wi)+pi

下面是逆推法的一種寫法

#include

using

namespace std;

#define n 50

int n,w[

100]

,p[100

],c,m[

100]

[100];

voidmm(

)for

(i=n-

1; i>=

1; i--)}

}void

show()

}if(m[1

][c]

-sp==p[n]

) cout<<

"w="

<" ,pmax="

<}int

main()

mm();

show()

;}

這個是順推法的寫法

#include

using

namespace std;

intmain()

for(j=

0;j<=c;j++

)for

(i=2

;i<=n;i++)}

cw=c;

cout<<

"揹包所裝的物品: "

(" i w(i) p(i)\n");

for(sp=

0,sw=

0,i=n;i>=

2;i--)}

if(m[n]

[c]>sp)

printf

("w=%d, pmax=%d \n"

,sw,sp)

;}

0 1揹包(動態規劃解法)

動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...

01揹包問題的動態規劃解法

參考 問題描述 給定n中物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問...

動態規劃01揹包問題之跳躍點解法

m i j ma xm i,j max m i,j max m i j 代 表餘量j 從第乙個 物品到第 i個物品 的最優價 值m i,j 代表餘量j從第乙個物品到第i個物品的最優價值 m i,j 代表餘量 j從第一 個物品到 第i個物 品的最優 價值p i 代表m i,j 的跳躍 點點 集p i ...