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)的主要内容,如果未能解决你的问题,请参考以下文章

suseoj 1210: 会场安排问题 (贪心)

suseoj 1212: 推箱子问题(bfs)

DFS_78. 子集

Leetcode 90. 子集 II dfs

suseoj 1207: 大整数的乘法(java, 大数相乘)

从dfs暴力->记忆化->子集背包dp->滚动数组优化