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[],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 -- 深搜 ---较难的更多相关文章
- NYoj The partial sum problem(简单深搜+优化)
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=927 代码: #include <stdio.h> #include & ...
- 简单深搜:POJ1546——Sum it up
结束了三分搜索的旅程 我开始迈入深搜的大坑.. 首先是一道比较基础的深搜题目(还是很难理解好么) POJ 1564 SUM IT UP 大体上的思路无非是通过深搜来进行穷举.匹配 为了能更好地理解深搜 ...
- (深搜)Sum It Up -- poj --1564
链接: http://poj.org/problem?id=1564 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...
- USACO 2.3.3 Zero Sum 和为零(深搜枚举)
Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...
- 2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)
题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem description In ICPCCamp, there ar ...
- 2015暑假多校联合---Cake(深搜)
题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- 【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目
[题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- poj 3249 Test for Job (记忆化深搜)
http://poj.org/problem?id=3249 Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissi ...
随机推荐
- vs2012+ winform+.net4.0发布如何在xp上运行
今天在英文版vs2013打包发布4.0(非4.0 client)的winform时,遇到了在xp上无法运行的情况,.net framework 4.0在xp上已安装.在打包前,winform工程,即菜 ...
- 解决windows安装TensorFlow2.0beta版本时ERROR: Cannot uninstall 'wrapt'问题
pip install -U --ignore-installed wrapt enum34 simplejson netaddr 参考:https://bugs.launchpad.net/rall ...
- How to read and write multiple files in Python?
Goal: I want to write a program for this: In a folder I have =n= number of files; first read one fil ...
- 洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通
[题解] 原来线段树还可以这么玩.. 我们用线段树维护连通性.对于一个矩形,我们用4个标记维护4个点的联通情况,再用两个标记维护右边两个点与它们右边的与它们在同一行的点的联通情况. 画图表示,就是 另 ...
- BZOJ 1012 洛谷1198 最大数 maxnumber
用线段数维护即可 #include<cstdio> #include<algorithm> #define ls (cur<<1) #define rs (cur& ...
- 在eclipse中如何在大量项目中查找指定文件
在eclipse中如果希望在大量的项目中寻找指定的文件可不是一件轻松的事,还好eclipse提供了强大的搜索功能. 我们可以通过通配符或正则表达式来设定查寻条件,下面是操作示例: ctrl+h 打开搜 ...
- Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据
表单提交时候我们应该控制提交按钮,不能点击多次进行数据的重复提交.要不然就会有冗余的重复的数据在系统中,造成系统出现数据垃圾.jQuery很简单的就可以实现对表单提交按钮控制,下面就是相关的例子和代码 ...
- MySQL慢日志切割邮件发送脚本
#!/bin/bashtime=`date -d yesterday +"%Y-%m-%d"`slowlog='/usr/local/percona/data/slow.log'# ...
- Snail—UI学习之自己定义通知NSNotification
背景是:一个界面跳转到第二个界面 然后 第一个界面发了一个通知 然后第二个界面收到这个通知后 把里面的数据取出来 在RootViewController.m中写入以下代码 #import " ...
- xcode 4.5 new feature __ ios6 新特性
上两周看了wwdc 2012 developer session 400 - 412的视频,以下总结一下xcode4.5的新特性.(部分參考onevcat的文章,在此感谢.) @synthesize ...