9502 子集問題

2021-09-28 10:07:29 字數 1086 閱讀 2313

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 10

2 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中的元素。當...