子集和問題

2021-06-28 06:58:42 字數 898 閱讀 8137

問題描述

子集和問題的乙個實力為。其中,s= 是乙個正整數的集合,c是乙個正整數。判定是否存在s的乙個子集s1使得s1的和為c。

輸入:輸入含多組測試用例!

對每組測試用例,第一行有兩個正整數n和c,n表示s的大小,c是子集和的目標值。接下來的一行,有n個正整數(1<= n <= 10000),表示集合s中的元素。當n=c=0時輸入結束。

輸出輸出子集和問題的全部解,每個資料後面都有乙個空格。當問題無解時,輸出「no solution!"。

輸入樣例:

5 10

2 2 6 5 4

5 32 2 6 5 4

0 0輸出樣例:

2 2 6

6 4no solution!

演算法分析

用回溯法解決子集和問題,與0-1揹包問題類似,解空間樹是一顆子樹。採用深度優先策略,演算法只記錄當前路徑。

**: 

#include #include #include #include #include using namespace std;

#define maxn 10001

int n,c;

int a[maxn],x[maxn];

int cw,bestw,sum,r;

void backtrack(int t)

return ;

} r -= a[t];

if(cw + a[t] <= c)

if(cw + r >= c)

r += a[t];

} int main()

backtrack(1);

if(sum == 0) printf("no solution!\n");

} return 0;

}

子集和問題

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

子集和問題

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

子集和問題

問題描述 給定乙個集合和乙個正整數c,判定是否存在該集和的子集,使其所有元素的和等於給定的正整數c?思路 利用二進位制,設集和中的某個數,0代表該數沒被選中,1代表該數被選中。則長度為n的集和,有2 n種選擇。通過for迴圈從0到n 1,集和中被選中的數相加,結果與正整數c相等,輸出該子集和。inc...