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 }
原文地址:https://www.cnblogs.com/GetcharZp/p/9162503.html