HDU 1258 Sum it up 搜索DFS

来源:互联网 发布:林书豪 数据 编辑:程序博客网 时间:2024/05/16 19:31

题目大意:给定N个数,要求输出相加为M的数字表达式,要求不重不漏。

题目分析:由于题目中给定的是不降序列,所以我们只需要用一个last指针来判断就可以做到不重.

如下代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int a[20],ans[20],sum,n;bool flag=false;bool v[20]; void dfs(int x,int count,int m)//当前搜索到第X个元素,count为ans指针,m为和 {int last;if(m>sum)return;if(m==sum){flag=true;for(int i=1;i<count;i++)//输出答案 {if(i==count-1)printf("%d\n",ans[i]);else printf("%d+",ans[i]);}}last=-1;//关键在于去重, 因为题目中是不降序,所以可以放心只用last指针判断 for(int i=x;i<=n;i++){if(last!=a[i]){ans[count]=a[i];last=a[i];dfs(i+1,count+1,m+a[i]);}}return ;}int main(){//freopen("1.out","w",stdout);while(scanf("%d%d",&sum,&n)!=EOF){if(!n||!sum)break;for(int i=1;i<=n;i++)scanf("%d",&a[i]);flag=false;printf("Sums of %d:\n",sum);dfs(1,1,0);if(!flag)printf("NONE\n");}//while(1);return 0;} 


0 0
原创粉丝点击