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