time limit: 10 second
memory limit: 2 mb
問題描述
子集和問題的乙個例項為〈s,c 〉。其中,s= 是乙個正整數的集合,c是乙個正整數。
程式設計任務 :對於給定的正整數的集合s= 和正整數c,程式設計計算s 的乙個子集s1 ,使得∑x (x∈s1) = c(子集s1的和等於c)
第一行有2個正整數n和c,n表示s集合中元素的個數,c是子集和的目標值。第二行有n個正整數,表示集合s中的元素
輸出一行資料,是子集和問題的解,當問題無解時,輸出"no solution!".(有解時,在解的後面多新增乙個空格和乙個換行符)
5 102 2 6 5 4
2 2 6【題解】
用乙個sum來累加當前選擇的數。深搜下就可以了。用過的數不能再用,sum > c後剪枝。還有乙個剪枝就是所有的數加起來仍然【**】
#include #include int n,c,a[5000],sum = 0,num = 0,ans[5001];
bool bo[5001];
void input_data()
if (sum == c) //如果所有的數剛好等於答案 則直接輸出所有的數
sum = 0; //這裡的sum用於搜尋時候的累加
for (int i = 1;i <= 5000;i++) //所有的數一開始都可以用
bo[i] = true;
}void output_ans()
void sear_ch(int t,int m) //t表示這個數的數值,m是這個數的下標
if (sum < c) //如果sum小於c則繼續搜素,否則不搜尋了 返回上一層
for (int i = 1;i <= n;i++)
if (bo[i]) //如果這個數字未被使用
sear_ch(a[i],i);
sum -= t; //回溯
num--;
bo[m] =true;
}void get_ans()
int main()
求子集問題
從訂閱部落格中看到這道題,於是花了上午的時間寫了一下,此題類似於 0 1揹包問題,故複習了一下,分別有遞迴和非遞迴的解法。題目 給定乙個數 t,以及 n個整數,在這 n個整數中找到相加之和為 t的所有組合,例如 t 4 n 6,這6 個數為 4,3,2,2,1,1 這樣輸出就有 4個不同的組合,它們...
子集和問題
題目描述 子集和問題的乙個例項為 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中的元素。當...