1. 程式人生 > 其它 >演算法第五章最小重量機器設計問題

演算法第五章最小重量機器設計問題

1、題目名稱:最小重量機器設計問題

2、問題描述:

設某一機器由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 

3、演算法描述

#include <iostream>
using namespace std;
int w[30][30];
int c[30][30];

int n, m, d;
int cw = 0;
int cc = 0;
int bestw = 0x7fffffff;
int x[30];
int bestx[30];

void backtrack(int t) {
if (t > n) {
if (cw < bestw) {
bestw = cw;
for (int i = 1; i <= n; i++)
bestx[i] = x[i];
}
return;
}

for (int i = 1; i <= m; i++) {
x[t] = i;
cw += w[t][i];
cc += c[t][i];
if (cc <= d && cw < bestw) {
backtrack(t+1);
}
cc -= c[t][i];
cw -= w[t][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 << bestw << endl;
for (int i = 1; i <= n; i++)
cout << bestx[i] << " ";
cout << endl;

return 0;
}

4、

4.1解空間

以樣例為例寫出解空間:

(i,j,k)表示第1個部件選擇第i個供應商,第2個部件選擇第j個供應商,第3個部件選擇第k個供應商,以此類推。

(1,1,1)(1,1,2)(1,1,3)

(1,2,1)(1,2,2)(1,2,3)

(1,3,1)(1,3,2)(1,3,3)

(2,1,1)(2,1,2)(2,1,3)

(2,2,1)(2,2,2)(2,2,3)

(2,3,1)(2,3,2)(2,3,3)

(3,1,1)(3,1,2)(3,1,3)

(3,2,1)(3,2,2)(3,2,3)

(3,3,1)(3,3,2)(3,3,3)

4.2  每個結點的狀態值是該點的重量w和價格c。

5、對回溯演算法的理解

回溯法解題時通常包含3個步驟:

①針對所給問題,定義問題的解空間;

② 確定易於搜尋的解空間結構;

③以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。