#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 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行...