hdu 1258--DFS

http://acm.hdu.edu.cn/showproblem.php?pid=1258
题目描述:给你一个数t作为最后等式的和,并给你一组数a[i](i<12)作为等式的加数,每个加数最多只能使用一次,要求输出所有满足条件(加数从大到小输出)的等式,并且不能重复。
例:t=4. a[]={4,3,2,2,1,1}
输出 4,3+1,2+2,2+1+1
解题思路:题目要求输出从大到小输出,所以可以先给所有的数进行降序排序。数据的规模很小,所以可以用暴力搜索。搜索过程中,为了避免重复输出,需要记录前一层搜索的起点,下一层递归搜索的起点不能与前一层记录的点一样...说不清楚,具体见代码

 

复制代码
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int sum,n,ss[105],cnt,a[105];
 5 bool flag;
 6 void dfs(int k,int s)
 7 {
 8     if(s>sum)
 9         return;
10     if(s==sum)
11     {
12         flag=true;
13         for(int i=0;i<cnt-1;i++)
14             cout<<ss[i]<<'+';
15         cout<<ss[i]<<endl;
16         return;
17     }
18     int last=-1;           //避免重复
19     for(int i=k+1;i<=n;i++)
20     {
21         if(a[i]!=last)
22         {
23             last=a[i];
24             ss[cnt++]=a[i];
25             dfs(i,s+a[i]);
26             cnt--;
27         }
28     }
29 }
30 int main()
31 {
32     while(cin>>sum>>n,sum||n)
33     {
34         cout<<"Sums of "<<sum<<':'<<endl;
35         flag=false;
36         cnt=0;
37         for(int i=1;i<=n;i++)
38             cin>>a[i];
39         dfs(0,0);
40         if(!flag)
41             puts("NONE");
42     }
43     return 0;
44 }
复制代码

 

 

 

posted on   acoderworld  阅读(115)  评论(0)    收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示