實驗六 回溯演算法 二)

2021-10-13 22:53:12 字數 1270 閱讀 3037

一、實驗目的與要求

1、熟悉0-1問題;

2、掌握回溯演算法;

3、能對設計的演算法進行複雜度分析。

二、實驗題目

0-1揹包問題。 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?(在選擇物品裝入揹包 時,對每種物品只有兩種選擇,全部裝入或不裝入揹包)。(例如:重量如:,價值為:, 揹包容量為75)

三、實驗步驟

1、演算法設計思想

給定n 種物品和乙個容量為c 的揹包, 物品i 的重量是wi, 其價值為vi , 0/ 1 揹包問題是如何選擇裝入揹包的物品(物品不可分割) , 使得裝入揹包中物品的總價值最大,設計可能解的表示方式, 構成解空間樹。

2、實現的程式**

#include int n;

int c;

int v[100];

int w[100];

int cw = 0;

int cp = 0;

int bestp = 0;

int perp[100];

int order[100];

int put[100];

void knapsack()

if(cw+w[i]<=c)

if(bound(i+1)>bestp)

backtrack(i+1);

}int bound(int i)

if(i<=n)

b+=v[i]/w[i]*leftw;

return b;

}int main()

printf("請依次輸入%d個物品的價值:\n",n);

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

knapsack();

backtrack(1);

printf("最優價值為:%d\n",bestp);

printf("需要裝入的物品編號是:");

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

return 0;

}

3、實驗結果

四、實驗小結

本次實驗用回溯法解決0/1揹包問題,回溯法首先要建立0/1揹包的解空間樹,然後再回溯得出搜素空間,即解的範圍,然後求出最佳答案

六 回溯演算法

基本思想 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇。滿足回溯條件的某個狀態的點...

全排列的演算法(六) 回溯法

全排列的生成演算法 六 回溯法 回溯法通常是構造一顆生成樹。以3 個元素為例 樹的節點資料可取值是1 2 3。如果某個節點為 0,則表示尚未取值。初始狀態是 0,0 0 第1 個元素值可以分別挑選1,2,3,因此擴充套件出 3個子結點。用相同方法找出這些結點的第 2個元素的可能值,如此反覆進行,一旦...

演算法實驗4《回溯法》

1.編寫乙個簡單的程式,解決8皇后問題。include using namespace std bool backtrack int list 8 int t return false intmain 2.批處理作業排程問題 問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任...