回溯法求解0-1揹包問題
問題描述:略
解題分析:確定約束函式和限界函式
*約束函式:cw(i)+w(i)
<=total_weight --重量
*限界函式:b(i)
= cv(i)+r(i)
; --價值
解空間組織:樹或圖
樹結構:子集樹、排列樹
搜尋方式:深度優先
演算法的核心:回溯函式&限界函式,其中約束函式沒有單獨寫出來,在**中有用到
//回溯函式
//每個結點的左右子樹都要判斷,因為裝或不裝兩種情況都要考慮
void
backtrack
(int i)
return;}
if(cw + w[i]
<= capacity)if(
bound
(i+1
)> bestv)
//搜尋右子樹,必要時剪枝
backtrack
(i+1);
}
//計算上界函式
double
bound
(int i)
//將剩餘物品按單位重量價值排序
knapsack
(i);
while
(i<=c_num && w2[i]
<=leftw)
if(i<= c_num)
b += v2[i]
/w2[i]
* leftw;
return b;
}
其他部分:
#include
"backpack.h"
#include
using
namespace std;
//宣告變數
int c_num;
//物品數量
double capacity;
//揹包容量
double v[
100]
;//各個物品的價值
double w[
100]
;//各個物品的重量
double cw =
0.0;
//當前揹包的重量
double cv =
0.0;
//當前揹包中物品價值
double bestv =
0.0;
//當前最優價值
double perv[
100]
;//物品按單位重量價值排序
int x[
100]
;//是否裝入,為0或1
int best[
100]
;//記錄最優解,為0或1
double v2[
100]
;//臨時存放各個物品的價值
double w2[
100]
;//臨時存放各個物品的重量
intmain()
cout
("pause");
return0;
}//第一步:初始化
void
init()
}//第二步:排序【快速排序】
void
quicksort
(int p,
int q,
double arr,
double key)
quicksort
(p,j-
1,arr,arr[p]);
quicksort
(j+1
,q,arr,arr[j+1]
);}//交換兩元素
void
swap
(int i,
int j,
double arr)
//按單位價值排序
void
knapsack
(int t)
回溯 0 1揹包問題
回溯演算法的要點 1,針對所給問題,定義問題的解空間。2,確定容易搜尋的解空間的組織結構。3,通過剪枝優化搜尋過程。下面通過求解0 1揹包問題來分析使用回溯演算法的過程 1,根據問題的描述,設所有的物件數是n,對應的重量和價值分別為w 0 n 1 和v 0 n 1 於是這個問題就轉化成在這n件物件中...
回溯 01揹包問題
這裡再簡單寫一下問題要求 給定n中物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,0 1揹包問題是如何選擇裝入揹包的物品 物品不可分割 使得裝入揹包的物品的價值為最大。1.題目分析 考慮到每種物品只有2 種選擇,即裝入揹包或不裝入揹包,並且物品數和揹包容量已給定,要計算裝入揹包物品的最大...
0 1揹包問題(回溯)
描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入多個測例,每個測例的輸入佔三行。第一行兩個整數 n n 10 和c,第二行n個整數分別是w1到w...