一、實驗目的與要求
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都有兩項任...