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 2013-02-19 13:44 acoderworld 阅读(115) 评论(0) 收藏 举报
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步