01揹包問題(回溯)

2021-10-13 23:48:56 字數 2025 閱讀 5391

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