算法第五章實驗報告
7-2 最小重量機器設計問題 (25 分)
設某一機器由n個部件組成,每一種部件都可以從m個不同的供應商處購得。設wij?是從供應商j 處購得的部件i的重量,cij?是相應的價格。 試設計一個算法,給出總價格不超過d的最小重量機器設計。
輸入格式:
第一行有3 個正整數n ,m和d, 0<n<30, 0<m<30, 接下來的2n 行,每行n個數。前n行是c,后n行是w。
輸出格式:
輸出計算出的最小重量,以及每個部件的供應商
輸入樣例:
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
結尾無空行
輸出樣例:
在這里給出相應的輸出。例如:
4
1 3 1
1.2解空間樹
![]()
代碼:
#include <iostream>
using namespace std;
int n;
int m;
int d;
int w[1000][1000];
int c[1000][1000];
int minw=100000000;
int curw=0;
int curc=0;
int minx[1000];
int x[1000];
void backtrack(int t){
if(t>n){
if(curw<minw){
minw=curw;
for(int i=1; i<=n; i++){
minx[i]=x[i];
}
}
}
else{
for(int i=1; i<=m; i++){
curc+=c[t][i];
curw+=w[t][i];
x[t]=i;
if(curc<=d && curw<minw){
backtrack(t+1);
}
curc-=c[t][i];
curw-=w[t][i];
x[t]=0;
}
}
}
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<<minw<<endl;
for(int i=1; i<=n; i++){
cout<<minx[i]<<" ";
}
cout<<endl;
return 0;
}
2.0我對回溯算法的理解
回溯算法采用深度優先方式搜索在空間樹中搜索問題解,在使用中我們要注意添加限界函數來降低運行時間。


浙公網安備 33010602011771號