hdu1258 dfs 给一个指定的target数和一个数列,要求不重复选择其中的数使得和为target并打印,结果不可重复。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned int ui;
 4 typedef long long ll;
 5 typedef unsigned long long ull;
 6 #define pf printf
 7 #define prime1 1e9+7
 8 #define prime2 1e9+9
 9 #define scand(x) scanf("%llf",&x)
10 #define f(i,a,b) for(int i=a;i<=b;i++)
11 #define scan(a) scanf("%d",&a)
12 #define dbg(args) cout<<#args<<":"<<args<<endl;
13 #define pb(i) push_back(i)
14 #define ppb(x) pop_back(x)
15 #define maxn 100
16 int n,m,t,cnt;
17 int a[maxn],b[maxn];
18 void dfs(int sum,int posa,int posb)
19 {
20     if(sum>m)return;
21     if(sum==m)
22     {
23         cnt++;
24         f(i,1,posb-1)
25         {
26             if(i!=1)
27             {
28                 pf("+%d",b[i]);
29             }
30             else pf("%d",b[1]);
31         }
32         pf("\n");
33         return;
34     }
35     f(i,posa,n)
36     {
37         b[posb]=a[i];
38         dfs(sum+b[posb],i+1,posb+1);
39         while(i+1<=n&&a[i]==a[i+1])i++;
40     }
41     return ;
42 }
43 int main()
44 {
45     std::ios::sync_with_stdio(false);
46     //freopen("input.txt","r",stdin);
47     //freopen("output.txt","w",stdout);
48     while(scanf("%d %d",&m,&n)==2&&!(n==0&&m==0))
49     {
50         cnt=0;
51         memset(a,0,sizeof(a));
52         memset(b,0,sizeof(b));
53         f(i,1,n)scan(a[i]);
54         sort(a+1,a+n+1,greater<int>());
55         pf("Sums of %d:\n",m);
56         dfs(0,1,1);
57         if(!cnt)
58         {
59             pf("NONE\n");
60         }
61     }
62  } 

 

posted @ 2020-02-29 19:03  WA自动机~  阅读(163)  评论(0编辑  收藏  举报