• Sum It Up -- 深搜 ---较难


    每一行都是一组测试案例   第一个数字 表示总和 第二个数字表示 一共有几个可用数据  现在 按照从小到大的顺序   输出  那些数字中若干数字之和为总和的  信息 /.

    很好很明显的  遍历痕迹 , 多看多练

    //   利用vector不定长数组  构图    然后就知道  某个节点相邻的 所有节点
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<set>
    #include<stack>
    #include<string>
    #include<sstream>
    #include<map>
    #include<cctype>
    using namespace std;
    int a[105],n,b[105],visited[105],q,m,mark;   //  一共有几个数字 ?   数字储存
    void DFS(int s,int sum)   //   先  弄第一个
    {
        if(sum>m)                   //    这种 剪枝   能有一个就有一个
            return ;
        if(sum==m)    //  输出
        {
            printf("%d",b[1]);
            for(int i=2;i<q;i++)
                printf("+%d",b[i]);
            printf("
    ");
            mark=0;
            return ;
        }
        for(int i=1;i<=n;i++)
        {
            if(visited[i])   //  发现 已经  用过了   那就     直接下一步 吧  .
                continue;
            if(a[i]<=m-sum&&b[q-1]>=a[i])   //  能放进去    并且 是递减顺序       //   根据题目中的 要求 来限定条件     搜索 也算是一种 模拟呀  .
            {
                visited[i]=1;
                sum+=a[i];
                b[q++]=a[i];
                DFS(s,sum);
                q--;
                sum-=a[i];
                visited[i]=0;
                while(a[i]==a[i+1])  /*  如果有两个相同的数字在一起 当以其中某一个数字为开头的话  从后面找到一个符合题意的解 轮到和这个数字相同的的数值的时候 会又出现以i从这样的情况所以需要直接这样跳过去*/
                    i++;            //  不过 如果跳的时候 需要实现 有序排列
            }
        }
    
    }
    int main()
    {
        while(scanf("%d%d",&m,&n),(n||m))
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            printf("Sums of %d:
    ",m);
            memset(visited,0,sizeof(visited));
            mark=q=1;
            b[0]=1111111;
            DFS(1,0);
            if(mark)
                printf("NONE
    ");
        }
    }

    人逢A题 , 精神爽 , 来一发改进版的 , 这个答案是做了http://www.cnblogs.com/A-FM/p/5334822.html  Stick神题得到的启示

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<vector>
     8 #include<set>
     9 #include<stack>
    10 #include<string>
    11 #include<sstream>
    12 #include<map>
    13 #include<cctype>
    14 using namespace std;
    15 int n,m,a[105],q,b[105],visited[105],flag;
    16 void DFS(int sum,int mark,int index)
    17 {
    18     if(sum==m)
    19     {
    20         printf("%d",b[0]);
    21         for(int i=1;i<mark;i++)
    22             printf("+%d",b[i]);
    23         printf("
    ");
    24         flag=0;
    25     }
    26     if(sum>m)
    27         return ;
    28     for(int i=index;i<n;i++)
    29     {
    30         if(visited[i]||(a[i]==a[i-1]&&!visited[i-1]))  //  这一个和上一个相同而且 上一个  没用 这个就也不用了
    31             continue;
    32         if(sum+a[i]<=m)
    33         {
    34             visited[i]=1;
    35             b[mark]=a[i];
    36             DFS(sum+a[i],mark+1,i+1);
    37             visited[i]=0;
    38         }
    39     }
    40 }
    41 int main()
    42 {
    43     while(scanf("%d%d",&m,&n)&&(n||m))
    44     {
    45         for(int i=0;i<n;i++)
    46             scanf("%d",&a[i]);
    47         memset(visited,0,sizeof(visited));
    48         printf("Sums of %d:
    ",m);
    49         flag=1;
    50         DFS(0,0,0);
    51         if(flag)
    52             printf("NONE
    ");
    53     }
    54     return 0;
    55 }

     

  • 相关阅读:
    第二章 课后习题 6
    第二章 课后习题 5
    第一章 课后习题 10
    第一章 课后习题 7
    JAVA练习1
    作业2
    作业
    c++作业10月13日作业
    c++作业50页例题3.1
    for循环作业4和5
  • 原文地址:https://www.cnblogs.com/A-FM/p/5328624.html
Copyright © 2020-2023  润新知