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 }

 

原文地址:https://www.cnblogs.com/A-FM/p/5328624.html