1. 程式人生 > 其它 >演算法第五章實踐報告

演算法第五章實踐報告

1. 請用回溯法的方法分析“最小重量機器設計問題

#include <iostream>
using namespace std;
int n,m,d;
int w[40][40];//重量
int c[40][40];//價格
int bestx[40];//最優解
int x[40];//當前解
int cw=0,cc=0,mw=9999999;//當前重量 當前價格 當前解
void Backtrack(int depth){
if(depth>n){//找到根節點
if(cw<mw){//當前值小於最小值
for(int i=1;i<=n;i++)
bestx[i]=x[i];
mw=cw;
}
return;
}
for(int i=1;i<=m;i++){ //m個商店對應n層分叉樹
x[depth]=i;
cc+=c[depth][i];
cw+=w[depth][i];
if(cc<=d&&cw<mw){// 當前價格小於最優價格 當前重量小於最優重量
Backtrack(depth+1);
}
x[depth]=0;//回溯 更新資訊
cc-=c[depth][i];
cw-=w[depth][i];
}
}
int main(){
cin>>n>>m>>d;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>w[i][j];
}
}
Backtrack(1);
cout<<mw<<endl;
for(int i=1;i<=n;i++){
cout<<bestx[i]<<" ";
}
return 0;
}

1.1說明“最小重量機器設計問題"的解空間

對於每一種部件,都有不同的供應商進行選擇,而每一個供應商都有對應的重量w和價格c。

1.2說明 “最小重量機器設計問題"的解空間樹

1.3在遍歷解空間樹的過程中,每個結點的狀態值是什麼

對每一個節點來說,都有對應的兩個指標,分別為其在選擇了t個供應商後的總價格和總重量。

2.你對回溯演算法的理解

我理解的回溯法,主要用的是深度優先遍歷,它把問題的解空間轉化成了圖或者樹的結構表示。首先從根節點出發搜尋解空間樹,當演算法搜尋至解空間樹的某一節點時,先利用剪枝函式判斷該節點是否能得到問題的解。如果不可行,則跳過以該節點為根的子樹的搜尋,逐層向其祖先節點回溯;否則,進入該子樹,繼續按深度優先策略搜尋。