今天想要分析的也是一道用回溯法搜尋排列樹的問題。
1、問題描述:
設某一機器由n個部件組成,每一種部件都可以從m個不同的**商處購得。設w[i][j]是從**商j處購得的部件i的重量,c[i][j]是相應的**,給出總**不超過d的最小重量機器設計。
2、解題思路:
3、演算法設計:
a.部件有n個,**商有m個,分別用w[i][j]和c[i][j]儲存從**商j 處購得的部件i的重量和相應**,d為總**的上限。
b.用遞迴函式backtrack(i)來實現回溯法搜尋排列樹(形式引數i表示遞迴深度)。
① 若cp>d,則為不可行解,剪去相應子樹,返回到i-1層繼續執行。
② 若cw>=sum,則不是最優解,剪去相應子樹,返回到i-1層繼續執行。
④ 用for迴圈對部件i從m個不同的**商購得的情況進行選擇(1≤j≤m)。
c.主函式呼叫一次knapsack(1)即可完成整個回溯搜尋過程,最終得到的sum即為所求最小總重量。
4.演算法時間複雜度:
程式中最大的迴圈出現在遞迴函式backtrack(i)中,而此函式遍歷排列樹的時間複雜度為o(n!),故該演算法的時間複雜度為o(n!)。
5.
#include
#define n 1000
using namespace std;
int n,m,d,cp=0,cw=0,sum=0;
int c[n][n],w[n][n];
void backtrack(int i)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>w[i][j];
backtrack(1);
cout
return 0;
}
演算法分析最小重量機器設計問題
今天想要分析的也是一道用回溯法搜尋排列樹的問題。1 問題描述 設某一機器由n個部件組成,每一種部件都可以從m個不同的 商處購得。設w i j 是從 商j處購得的部件i的重量,c i j 是相應的 給出總 不超過d的最小重量機器設計。2 解題思路 3 演算法設計 a.部件有n個,商有m個,分別用w i...
最小重量機器設計問題
最小重量機器設計問題 設某一機器由 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,...