子集和問題

2021-10-25 09:46:21 字數 1388 閱讀 7542

子集和問題的乙個例項為 ( s, c )。其中,s=是乙個正整數的集合,c是乙個正整數。

對於給定的正整數的集合s,是否存在s的乙個子集s1之和等於c 。試設計乙個解子集和問題的回溯法。

輸入第一行有兩個正整數n 和c,n 表示s的大小( 0 < n < 7000 ),c是子集和的目標值。接下來的一行,有n個正整數,表示集合s中的元素。

本題有多解,請輸出滿足條件的、按公升序排列最小的子集。

如:存在兩個解:2 2 6 和 6 4,則輸出2 2 6這個解。當問題無解時,輸出 「no solution!」

5 10

2 2 6 5 4

2 2 6

c/c++_code

///離亭晚2020.11.16.00.00.51

#include.h>

using namespace std;

bool finds,used[

7002];

int n,c,sum;

int len=0;

int a[

7002

],b[

7002];

void

dfs(int i)

printf

("\n");

return;}

if(finds==

true

)return

;//finds==true,即刻退出dfs

if(i>n)

return

;//i從始 (1...n),保證遞迴層數不超過 n

if(sum+b[i]

return

;//當前sum加字尾和仍小於c,繼續dfs也不能使sum==c

if(a[i]

+sum>c)

sum+=a[i]

; used[i]

=true

;dfs

(i+1);

sum-=a[i]

; used[i]

=false

;dfs

(i+1);

return;}

int main()

sort

(a,a+n+1)

; b[n]

=a[n]

;for

(int i=n-

1;i>

0;i--

)//b存字尾和

b[i]

=a[i]

+b[i+1]

;dfs(1

);if(finds==

false

)printf

("no solution!\n");

return0;

}

end

子集和問題

題目描述 子集和問題的乙個例項為 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,並列出表示式 並且要求表示式不相同。若表示式中的元素相同則表示式就相同,...