回溯法 0 1揹包問題

2021-08-10 08:08:44 字數 979 閱讀 7185

#include #include using namespace std;

class knap

;void knap::backtrack(int i)//對第i個物品進行操作

return;

}/*如果沒有到葉子節點,就要對這個節點進行操作,即搜尋它的子樹,進入做左子樹表示可以選第i個,進入右子樹表示不能選第i個*/

if(cw+w[i]<=c)//如果能夠進入左子樹

/*如果要進入右子樹,需要求出剩餘物品的最大價值*/

r-=p[i];//因此這裡的r需要就去p[i]表示不選它之後,剩下物品的全部價值之和

if(cp+r>bestp)//已有的價值加上剩下全部的價值之和都不能大於bestp的話就沒有進入右子樹的必要了,如果滿足括號裡的條件,說明還有機會再右子樹裡面找到最優解

r+=p[i];//右子樹探索完之後要恢復現場,因此r要恢復到原來的值

}int knapsack(int w,int p,int c,int n,int bestx)

x.n=n;

x.bestp=0;

x.cp=0;

x.cw=0;

/*初始化r*/

x.r=0;

for(int i=1;i<=n;i++)

x.r+=p[i];

/*呼叫遞迴函式*/

x.backtrack(1);

/*返回最優解向量*/

for(int i=1;i<=n;i++)

bestx[i]=x.bestx[i];

/*返回最優解*/

return x.bestp;

}int main()

,p[6]=,bestx[6]=,c=10,n=5;//測試引數

回溯法 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...

回溯法 0 1揹包問題

時限 1000ms記憶體限制 10000k總時限 3000ms 描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行...