子集和问题 - 回溯 / 搜索

题目地址:http://www.51cpc.com/web/problem.php?id=4264

Summarize:

  其实一看到这道题我就想到了01背包,但是卡死在了如何顺序输出,哎。回溯么,我只会写递归的,非递归的早忘了。。后续补充;

 搜索:

  1. 注意特判所有元素加起来都小于C;

  2. 递归内循环从0开始,由于vis不必担心重复;但题目要求顺序输出,故应从第一个开始;

附搜索代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #define inf 1e9
 4 typedef long long LL;
 5 using namespace std;
 6  
 7 const int N = 7e3+5;
 8 LL n,c;
 9 LL a[N], vis[N], can;
10  
11 void dfs(int i, LL sum)
12 {
13     if(can || i>=n) return;
14     
15     if(sum == c)
16     {
17         can=1;
18         int i=0;
19         while(!vis[i] && i<n) i++;
20         cout<<a[i];
21         for(i++; i<n; i++)
22             if(vis[i]) cout<<' '<<a[i];
23         cout<<endl;
24         return;
25     }
26      
27     for(int k=0; k<n; k++) {
28         if(sum+a[k]<=c && !vis[k]) {
29             vis[k] = 1;
30             dfs(k, sum+a[k]);
31             vis[k] = 0;
32         }
33     }
34 }
35  
36 int main()
37 {
38     ios::sync_with_stdio(false);
39     
40     while(cin>>n>>c)
41     {
42         can=0;
43         LL sum=0;
44         for(int i=0; i<n; i++) {
45             cin>>a[i], vis[i]=0;
46             sum += a[i];
47         }
48         if(sum < c) {
49             cout<<"No Solution!"<<endl;
50             continue;
51         }
52         dfs(0,0);
53         if(!can) cout<<"No Solution!"<<endl; 
54     }
55 }
扫描二维码关注公众号,回复: 2481973 查看本文章

猜你喜欢

转载自www.cnblogs.com/liubilan/p/9394846.html