suseoj 1211: 子集和问题 (dfs)
Posted getcharzp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了suseoj 1211: 子集和问题 (dfs)相关的知识,希望对你有一定的参考价值。
1211: 子集和问题
时间限制: 1 Sec 内存限制: 128 MB提交: 2 解决: 2
[提交][状态][讨论版][命题人:liyuansong]
题目描述
子集和问题的一个实例为<S,t>。其中,S={x1,x2,...,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得
试设计一个解子集和问题的回溯法。
对于给定的正整数的集合S和正整数c,计算S的一个子集S1使得
输入
第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值。接下来的1行中,有n个正整数,表示集合S中的元素。
输出
将子集和问题的解输出。当问题无解时,输出“Solution!”。
样例输入
5 10 2 2 6 5 4
样例输出
2 2 6
C/C++ 代码实现(AC):
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 #include <climits> 10 11 using namespace std; 12 const int MAX = 1e6 + 10; 13 int A[MAX], ANS[MAX], n, m, N, flag = 0, my_book[MAX] = {0}; 14 15 void dfs(int cnt, int step) 16 { 17 if (cnt == m) 18 { 19 N = step; 20 flag = 1; 21 return ; 22 } 23 if (cnt > m) return ; 24 for (int i = 0; i < n; ++ i) 25 { 26 if (my_book[i]) continue; 27 if (flag) return ; 28 my_book[i] = 1; 29 ANS[step] = A[i]; 30 dfs(cnt + A[i], step + 1); 31 my_book[i] = 0; 32 } 33 } 34 35 int main() 36 { 37 cin >>n >>m; 38 for (int i = 0; i < n; ++ i) 39 { 40 scanf("%d", &A[i]); 41 } 42 dfs(0, 0); 43 if (!flag) cout <<"Solution!" <<endl; 44 else 45 { 46 for (int i = 0; i < N - 1; ++ i) 47 cout <<ANS[i] <<" "; 48 cout <<ANS[N - 1] <<endl; 49 } 50 return 0; 51 }
以上是关于suseoj 1211: 子集和问题 (dfs)的主要内容,如果未能解决你的问题,请参考以下文章