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

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

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

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

 #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 n,m,a[],q,b[],visited[],flag;
void DFS(int sum,int mark,int index)
{
if(sum==m)
{
printf("%d",b[]);
for(int i=;i<mark;i++)
printf("+%d",b[i]);
printf("\n");
flag=;
}
if(sum>m)
return ;
for(int i=index;i<n;i++)
{
if(visited[i]||(a[i]==a[i-]&&!visited[i-])) // 这一个和上一个相同而且 上一个 没用 这个就也不用了
continue;
if(sum+a[i]<=m)
{
visited[i]=;
b[mark]=a[i];
DFS(sum+a[i],mark+,i+);
visited[i]=;
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)&&(n||m))
{
for(int i=;i<n;i++)
scanf("%d",&a[i]);
memset(visited,,sizeof(visited));
printf("Sums of %d:\n",m);
flag=;
DFS(,,);
if(flag)
printf("NONE\n");
}
return ;
}

Sum It Up -- 深搜 ---较难的更多相关文章

  1. NYoj The partial sum problem(简单深搜+优化)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=927 代码: #include <stdio.h> #include & ...

  2. 简单深搜:POJ1546——Sum it up

    结束了三分搜索的旅程 我开始迈入深搜的大坑.. 首先是一道比较基础的深搜题目(还是很难理解好么) POJ 1564 SUM IT UP 大体上的思路无非是通过深搜来进行穷举.匹配 为了能更好地理解深搜 ...

  3. (深搜)Sum It Up -- poj --1564

    链接: http://poj.org/problem?id=1564 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...

  4. USACO 2.3.3 Zero Sum 和为零(深搜枚举)

    Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...

  5. 2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)

    题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem  description In ICPCCamp, there ar ...

  6. 2015暑假多校联合---Cake(深搜)

    题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...

  7. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

  8. 【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目

    [题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. poj 3249 Test for Job (记忆化深搜)

    http://poj.org/problem?id=3249 Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissi ...

随机推荐

  1. bootstrap中栅格系统的原理

    1.基本结构 Bootstrap采取12列的栅格体系,根据主流设备的尺寸进行分段,每段宽度固定,通过百分比和媒体查询实现响应式布局. Bootstrap划分了四种尺寸:超小屏(手机).小屏(平板竖屏) ...

  2. web项目的创建

    1) 创建Mave的webapp项目 2) 在Pom文件中添加servlet-api的依赖 <dependency> <groupId>javax.servlet</gr ...

  3. String与StringBuffer,StringBuilder

    在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作.不可变类. 3.StringBuffer 也是对一串字符进行操作,但是可变 ...

  4. hdu3461

    题意描述:有一个类似滚轮式的密码锁放在一排共n个,有m种操作每次操作一个区间,且此次操作后的所有密码相同,问最多能形成多少种密码 解决:将区间分为可变部分和不可变部分,没当有可变部分时候总区间数要减去 ...

  5. Spring @Conditional注解 详细讲解及示例

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xcy1193068639/article/details/81491071 前言: @Conditi ...

  6. nyoj_600_花儿朵朵_201404162000

    花儿朵朵 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 春天到了,花儿朵朵盛开,hrdv是一座大花园的主人,在他的花园里种着许多种鲜花,每当这个时候,就会有一大群游 ...

  7. 复习es6-let和const

    1.声明变量的方法 es5 : var   function es6 : var   function   let    const   class 2.let(const)与var 不同 let不能 ...

  8. ISO和焦距

    要说什么是ISO还要从传统胶片相机说起,ISO称作为感光度,它是衡量传统相机所使用胶片感光速度的国际统一指标,其反映了胶片感光时的速度(其实是银元素与光线的光化学反应速率).而对于现在并不使用胶片的数 ...

  9. 登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

    登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

  10. ubuntu 建立加密分區及其安全刪除

    加密分區1: sudo apt-get install cryptsetup2: 用“磁盤實用工具“,建立新的分區 或者 格式化現有分區,且勾選“加密底層設備“,按提示設定密碼3:同時選擇加密條件:i ...