子集和問題(回溯法)

2021-10-05 22:58:10 字數 1441 閱讀 3915

第五章5-1 子集和問題

實驗報告

一、問題分析

處理的物件:給定的集合元素的個數和集合以及要湊成的和

要實現的功能:對於給定的集合,計算出它的乙個子集,使得子集內元素的和等於給出的正整數。(這乙個子集就是最先計算出的那個子集)

演算法思想:當我們給出集合個數n和要湊成的和m以及n個集合元素,

我們使用乙個b[max]陣列儲存我們算出的子集,a[max]儲存給出的

集合,sum儲存和,我們每次看prime如果等於一表示已經輸出了一

個子集了,就返回。

然後看sum是不是等於n,如果是就輸出b陣列,並且bool型別

prime置一。

如果不滿足上述條件,我們假設假設a[k]在目標集合中,將a[k]

放到目標集合,繼續尋找下乙個元素,如果剛才的元素不能到最後

輸出,那麼會回到這,表示這個元素不在其中,將目標集合的這個元素清零,繼續尋找下乙個元素 。

詳細求解過程:假設我們所給的集合為,首先,把2加入到b陣列子集中。將sum加上2的值,此時sum為2。接著往下走,第二個元素2也不在子集中,將其加入到b陣列,此時sum的值為4。繼續往下走,第三個元素6不在子集中,將其加入到b陣列,此時sum的值為10,恰好與給定的正整數c的值相等,輸出b陣列。對於子集和問題,找到問題的乙個解即可,因此程式結束,將2 2 6輸出到output.txt檔案中。

二、演算法設計

演算法思想的設計:本題採取回溯法,從第乙個元素開始,將這個元素加到子集當中來 ,將sum加上這個元素的值。我們使用乙個b[max]陣列儲存我們算出的子集,a[max]儲存給出的集合,sum儲存和,我們每次看prime如果等於一表示已經輸出了乙個子集了,就返回。然後看sum是不是等於n,如果是就輸出b陣列,並且bool型別prime置一。如果不滿足上述條件,我們假設假設a[k]在目標集合中,將a[k]放到目標集合,繼續尋找下乙個元素,如果剛才的元素不能到最後輸出,那麼會回到這,表示這個元素不在其中,將目標集合的這個元素清零,繼續尋找下乙個元素 。

最後判斷prime如果為0,就輸出「no solution!」

演算法關鍵步驟:

實現函式

主函式

驗證:

三、演算法效能分析

時間複雜度:2^n。

子集和問題(回溯法)

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

回溯法之子集和問題

問題描述 設集合s 是乙個正整數集合,c是乙個正整數,子集和問題判定是否存在s的乙個子集s1,使s1中的元素之和為c。試設計乙個解子集和問題的回溯法。將子集和問題的解輸出。當問題無解時,輸出 no solution 因為我在 裡的注釋已經寫了很多了,大家將就看著注釋理解哈 直接貼 includeus...

回溯法之子集和問題

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...