回溯法之子集和問題

2021-07-25 20:49:46 字數 864 閱讀 4946

問題描述:設集合s=是乙個正整數集合,c是乙個正整數,子集和問題判定是否存在s的乙個子集s1,使s1中的元素之和為c。試設計乙個解子集和問題的回溯法。將子集和問題的解輸出。當問題無解時,輸出「no solution!」。

因為我在**裡的注釋已經寫了很多了,大家將就看著注釋理解哈

直接貼**:

#includeusing namespace std;

#define n 10000

int n, c, rest = 0;//rest表示從當前元素加到最後乙個元素的總和,用來回溯時判斷限界剪枝

int a[n];//a[n]儲存s集合元素 ,最多可以儲存n個

int x[n] = ;//設定x[n]來表示a[n]元素是否選擇,初始為0,若為1則表示選擇

int sum = 0;//當前所選元素之和

bool backtrack(int t)//呼叫這個方法判斷是否有解

if( sum + rest >= c) //沒辦法確實不行,利用rest判斷限界剪枝 ,在子集樹中表示走右分支

rest += a[t];//把之前減掉的加回來

return false;//當層遍歷後發現沒有解決方案,返回false回去上一層

}int main()

if (!backtrack(1)) cout << "no solution!";//無解決方案

else

for( int i = 1; i <= n; i++)

if ( x[i] )//若為1則表示選擇了

cout << a[i] << " ";

cout << endl;

return 0;

}

回溯法之子集和問題

include include using namespace std define m 100 class sumofsub void sumofsub backtrack int t printf n return else x t 0 backtrack t 1 void sumofsub f...

子集和問題(回溯法)

第五章5 1 子集和問題 實驗報告 一 問題分析 處理的物件 給定的集合元素的個數和集合以及要湊成的和 要實現的功能 對於給定的集合,計算出它的乙個子集,使得子集內元素的和等於給出的正整數。這乙個子集就是最先計算出的那個子集 演算法思想 當我們給出集合個數n和要湊成的和m以及n個集合元素,我們使用乙...

子集和問題(回溯法)

給定乙個含有n個元素的整形陣列a,再給定乙個和sum,求出陣列中滿足給定和的所有元素組合,舉個例子,設有陣列a 6 sum 10,則滿足和為10的所有組合是 注意,這是個n選m的問題,並不是兩兩組合問題 最直觀的想法就是窮舉,把陣列中元素的所有組合情況都找出來,然後看看哪些組合滿足給定的和即可,這種...