最小重量機器設計問題

2021-10-12 10:01:59 字數 1339 閱讀 9473

設某一機器由n個部件組成,每種部件都可以從m個不同的**商處購得。設wij是從**商j處購得的部件的重量,cij是相應的**。設計乙個優先佇列式分支定界法,給出總**不超過d的最小重量機器設計。

資料輸入:第一行有3個整數n、m和d。接下來的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

這個問題有很多種解決方法,這裡我們以分支限界法中的最大收益優先的方式搜尋問題的子空間樹。以廣度優先的思想,把所有當前的活結點放入優先佇列中,取出當前重量最小的結點,拓展這個活結點的所有兒子結點並進行剪枝,如果結點深度等於樹的高度,就把最優解更新(如果結果沒有當前最優解好,在剪枝環節就會減掉,所以這一步不需比較)。當優先隊列為空時,說明已經遍歷了所有解,輸出最優值和最優解。

變數解釋:

w是從**商購得部件的重量,c表示部件的**,ans表示當前最優解,當前購得部件的個數(樹的深度)level和結點的編號idx。

e中儲存的是當前結點的總**和總重量,pre儲存的是當前結點的父節點的編號和當前選擇的**商號,優先佇列qu中第乙個數為結點的重量,第二個數為結點的編號。

#include using namespace std;

typedef pairpii;

const int n = 110;

int c[n][n], w[n][n], ans[n], level[n * n], idx = 1;

pii e[n * n], pre[n * n];

priority_queuequ;

int n, m, d, minw = int_max;

void bfs()); //初始化

while(!qu.empty())

else if(level[i.second] == n + 1)

else; //e[idx]中記錄新節點的**和重量

pre[idx] = ;

level[idx] = level[i.second] + 1;

qu.push();//優先佇列預設為大頂堆,所以把重量的相反數輸入,就可以構成小頂堆

idx ++;}}

}}int main()

最小重量機器設計問題

最小重量機器設計問題 設某一機器由 n個部件組成,每一種 都可以從 m個不同的 商處購得。設 wij是從 商 j處購得的部件 i的重量,cij是相應的 試設計乙個演算法,給出總 不超過 d的最小重量機器設計。樣例輸入 3 3 4 1 2 3 3 2 1 2 2 2 1 2 3 3 2 1 2 2 2...

最小重量機器設計問題

問題描述 設某一機器由n個部件組成,每一種 都可以從m個不同的 商處購得。設wij是從 商j處購得的部件i的重量,cij是相應的 試設計乙個演算法,給出總 不超過d的最小重量機器設計。題目型別 回溯演算法 如下 該題traceback num 中num代表的是第幾個部件 include int n,...

最小重量機器設計問題

問題描述 設某一機器由n個部件組成,每一種部件都可以從m個不同的 商處購得。設wij是從 商j處夠來的部件i的重量,cij是相應的 試設計乙個演算法,給出總 不超過c的最小重量機器設計。演算法設計 對於給定的機器部件重量和機器部件 計算總價值不超過d的最小重量機器設計。資料輸入 第一行由3個正整數n...