擴充套件子集和問題

2021-08-22 03:12:57 字數 1235 閱讀 8605

問題描述:給定乙個包含n個整數的陣列 set和固定值sum,判斷nums中是否存在若干個元素 a,b,c ...  使得 a + b + c +...=sum 。找出所有滿足條件且不重複的元組。

該問題由原問題擴充套件出來的,適用於求解陣列包含任意整數(包含正負零),任意元素組合且和為任意值m的不重複結果。

解題思路:

1、先將陣列 set按照絕對值大小逆排序,將所有0元素放在陣列後面

2、動態規劃分解問題,具體不細說了,很多博主都給出了方法和過程。

3、利用map來刪除重複子集

下面給出**:

其中,set是給出的集合;n為剩下的集合元素數;如果若干元素為固定值num,則第三個引數是它,若求解所有可能的集合,需要注釋下面那句話;sum為固定和;res為求解的符合要求的結果;results為所有集合解的結果。

void issubsetsum(vector&set, int n, int num, int sum, vector&temp, map, int>& results)

return;

}temp.push_back(set[n - 1]);

issubsetsum(set, n - 1, num, sum - set[n - 1], temp, results);

temp.pop_back();

issubsetsum(set, n - 1, num, sum, temp, results);

}bool compare(int &x, int &y)

int main(int argc, const char * argv) ;

sort(set.begin(), set.end(), compare);

int sum = 2;

solution s;

s.issubsetsum(set, set.size(),3, sum, res, results);

return 0;

}

注意:該方法對於求解子集和sum = 0不適用,如果要想求解和為0的集合,需要反向考慮,即遍歷陣列的每個元素,對其相反數求解集合其他元素的解。

1、正整數列n中取任意數和為m面試題之輸入n求和為m的所有組合

2、非負整數集,是否存在使所有元素和等於sum的子集:動態規劃之子集和問題

3、兩數之和,三數之和,四數之和

子集和問題

題目描述 子集和問題的乙個例項為 s,t 其中,s 是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得s1中的各元素之和等於c。題目出自 計算機演算法設計與分析 第3版 王曉東 思路 用回溯法解這道題,我本來想修改排列樹使之可以求出乙個集合的所有子集。但是分析了一下,時...

子集和問題

問題描述 子集和問題的乙個實力為。其中,s 是乙個正整數的集合,c是乙個正整數。判定是否存在s的乙個子集s1使得s1的和為c。輸入 輸入含多組測試用例!對每組測試用例,第一行有兩個正整數n和c,n表示s的大小,c是子集和的目標值。接下來的一行,有n個正整數 1 n 10000 表示集合s中的元素。當...

子集和問題

今天程式考試受挫,遂打算寒假空閒時間刷刷題,練練手感。今天有一題是這樣的,檔案 data.txt 有n 1行,每一行都為乙個正整數,第一行為n,剩餘n行為任意n個正整數。對於正整數m m 2 輸出m個數的和,要求和不大於100,並列出表示式 並且要求表示式不相同。若表示式中的元素相同則表示式就相同,...