• 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;
    }
  • 相关阅读:
    javascript 备忘 细节 相关
    内存泄漏
    css相关 细节 优化 备忘
    nodeType
    事件冒泡 模型
    两个感叹号作用
    非冒泡事件
    DOM 对象
    Quartz2D 之 绘制文本
    Voilin 与 乐谱
  • 原文地址:https://www.cnblogs.com/jiangjing/p/2891648.html
Copyright © 2020-2023  润新知