HDU-1258(DFS搜索的问题)

来源:互联网 发布:搞笑网络剧排行榜 编辑:程序博客网 时间:2024/05/17 22:22

题目就是给了你一个非升序的数列,让你求出所有的可以得到的某个确定和的数列.

需要注意的有这么几点:1,题目中要求很严格,是不允许输出一样的序列的.所以,你就只能把相邻两个相等得给筛去,当然这是同一递归层才筛去,不是同一递归层的你不能筛去.就要用到一个一个语句了 if(a[i]!=a[i-1]||j==pos+1)就可以解决这个问题.两个条件中满足其中的一个就执行,但咱们所需要筛去的恰恰是这两个条件都满足.

还要注意的就是DFS()回溯的时候的参数问题. 你可千万别把sum算出来再传进去.那样你回溯回来的时候想再用sum可就不行了,你可以选择来个t保留一下,当然更好的选择是你传sum+a[i];

贴上代码:(找错误找了N久......泪奔)

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <algorithm>using namespace std;int T,N;//SUM donates the  sum of all the integers,N donates the number of input;int a[105];int rec[105];int temp;void DFS(int sta,int n,int sum){if(sum==T){temp=1;for(int i=1;i<=n;i++){printf(i==1?"%d":"+%d",a[rec[i]]);}puts("");return;}for(int j=sta+1;j<=N;j++){if(a[j]!=a[j-1]||j==sta+1){if(T>=sum+a[j]){rec[n+1]=j;DFS(j,n+1,sum+a[j]);}}}}int main(){while(scanf("%d%d",&T,&N),T|N){temp=0;a[0]=-1;for(int i=1;i<=N;i++){scanf("%d",&a[i]);}printf("Sums of %d:\n",T);DFS(0,0,0);if(temp==0)printf("NONE\n");}return 0;}


 

原创粉丝点击