01揹包問題回溯法和動態規劃

2022-02-21 05:52:14 字數 1489 閱讀 7385

題目要求:

輸入揹包的容量v和物品的數量n;接下來n 行每行輸入兩個數字,第乙個是物品質量,第二個是物品價值;

輸出揹包容納物品的最大價值。

下面直接貼**:

回溯法

1 #include//

之前必須知道揹包容量和n個物品

2 #include3

using

namespace

std;

4class

property513

};14

class

pack

1524 ~pack()

2528

void

inputproperty()

2935 sort(property,property+number);36}

37int

command()

3846

if(totalweightreturn

totalvalue;

47 backtrack(0

);48

return

bestp;49}

50bool bound(int

i)51

60if(i61 currentp+=1.0*property[i].profit*currentw/property[i].weight;

62return currentp>bestp;63}

64void backtrack(int

i)65

72if(cw+property[i].weight<=capcity)//

此處必須用<=比較符號,不然會錯

7380

if(bound(i+1

));81 backtrack(i+1

);82}83

private:84

intcapcity,number;

85 property *property;

86int

cw,cp,bestp;

87};

88int

main()

8997

return0;

98 }

輸入:20 5

4 75 8

2 10

5 10

8 16

輸出:44

動態規劃法

1 #include2 #include3

using

namespace

std;

4int

main()525

}26for(int i=1;i<=weight;i++)

2732 cout<34}

35return0;

36 }

動態規劃 回溯法實現0 1揹包

v i,j 表示在前i 1 i n 個物品中能夠裝入容量為j 1 j c 的揹包中的物品的最大值 v i,0 v 0,j 0 式1 式2 式1表明 把前面i個物品裝入容量為0的揹包和把0個物品裝入容量為j的揹包,得到的價值均為0 式2的第乙個式子表明 如果第i個物品的重量大於揹包的容量,則物品i不能...

回溯法 0 1揹包問題

0 1揹包問題 給定n種物品和一揹包.物品i的重量是wi,其價值為ui,揹包的容量為c.問如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 0 1揹包是子集合選取問題,一般情況下0 1揹包是個np問題.第一步 確定解空間 裝入哪幾種物品 第二步 確定易於搜尋的解空間結構 可以用陣列p,w...

0 1揹包問題 回溯法

0 1揹包問題 回溯法 一 專案描述 每種物品只有2 種選擇,分別為 裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。二 演算法設計 a.物品有n種,揹包容量為c,分別用p i 和w i 儲存第i種物品的價值和重量,用x i...