題目要求:
輸入揹包的容量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 #include3using
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...