hdu 1258(dfs)

题意:首先给你一个t,然后是n,后面输入n个数(是非递增顺序的,亲~要注意一下哦),然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来。

思路:深搜思想,最重要的是如何避免重复的序列(详见代码)

代码实现:

#include<iostream>
#include<cstring>
using namespace std;
int sum,n,a[20],b[20],s,flag;
void dfs(int f,int num)//深搜
{
    int i,visited[101];
    if(s==sum) //满足题意就输出来
    {
        flag=0;
        for(i=0;i<num-1;i++)
            printf("%d+",b[i]);
        printf("%d\n",b[num-1]);
    }
    else
    {
        memset(visited,0,sizeof(visited)); //visited数组是用来避免重复的,这是精髓
        for(i=f;i<n;i++)
        {
           if(visited[a[i]]==0&&(s+a[i]<=sum))
           {
               visited[a[i]]=-1;
               s=s+a[i];
               b[num++]=a[i];
               dfs(i+1,num);
               s=s-a[i];
               num--;
           }
        }
    }
}
int main()
{
    int i;
    while(scanf("%d%d",&sum,&n)!=EOF&&(sum||n))
    {
        flag=1;
        printf("Sums of %d:\n",sum);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        s=0;
        dfs(0,0);
        if(flag)
            printf("NONE\n");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jiangjing/p/2891648.html