【经典DFS】NYOJ-1058-部分和问题
【题目链接:NYOJ-1058】
看到题目难度是2,所以想也没想,直接循环比较。。。结果果然。。。 是错的。
#include<cstdio>
#include<cstring>
int main(){
int n,k;
int i,j;
int a[] = {},num[] = {};
scanf("%d%d",&n,&k);
for(i = ;i < n;i++)
scanf("%d",&a[i]);
int ac = ,xx = ;
for(i = ;i < n;i++){
int sum = ;
for(j = i;j < n;j++){
sum += a[j];
num[xx] = a[j];
xx++;
if(sum == k){
ac = ;
break;
}
}
if(ac == )
break;
else{
xx = ;
memset(num,,sizeof(num));
}
}
if(ac){
printf("YES\n");
for(i = ;i < xx;i++)
printf("%d ",num[i]);
}else{
printf("NO");
}
return ;
}
以上错误代码,就不回忆为啥错了。。。 贴这儿供着吧。
这题的正确思路是运用DFS
详见:《挑战程序设计》 P30

#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
//部分和问题:
const int maxn = ;
stack<int>v;
int a[maxn];
int n,m,i,j,k;
bool dfs(int i = ,int sum = ) //已经从前i项得到了和sum,然后对于i项之后的进行分支
{
//停止条件 :如果前n项都计算过了,则返回sum是否与k相等
if(i==n) return sum==k;
//选择加或不加a[i]
//不加a[i]的情况
if(dfs(i+,sum)) return true;
//加上a[i]的情况
if(dfs(i+,sum+a[i])){
//若执行该条件,就说明该a[i]符合条件
v.push(a[i]);//压栈
return true;
}
return false; //无论是否加上a[i]都不能凑成k就返回false;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i = ;i < n;i++){
scanf("%d",&a[i]);
}if(dfs()){
printf("YES\n");
while(!v.empty()){
int x = v.top();
printf("%d ",x);
v.pop();
}
printf("\n");
}else
printf("NO\n");
}
return ;
}
优化:
1.当然也可以用数组代替栈,时间消耗会短8个。
2.在状态转移时,如果sum > k,则不需要继续进行了。
(因为是递归,递归的机制就是从上到下,再从下到上返回,所以数组保存的顺序是反向的)
优化代码:
#include<cstdio>
#include<stack>
using namespace std;
stack<int>v;
const int maxn = ;
int a[maxn];
//int sta[maxn];
int n,m,k,pos;
bool dfs(int i,int sum){
if(i==n) return sum==k;
else if(sum > k) return false; //剪枝(这么专业的名词也不知道用的对不对,反正就是优化了一下)
if(dfs(i+,sum)) return true;
if(dfs(i+,sum+a[i])){
//sta[pos++] = a[i];
v.push(a[i]);
return true;
}
return false;
}
int main(){
while(~scanf("%d%d",&n,&k)){
pos = ;
for(int i = ;i < n;i++){
scanf("%d",&a[i]);
}if(dfs(,)){
printf("YES\n");
// for(int i = pos - 1;i >= 0;i--)
// printf("%d ",sta[i]);
while(!v.empty()){
printf("%d ",v.top());
v.pop();
}
printf("\n");
}else
printf("NO\n");
}
return ;
}
【经典DFS】NYOJ-1058-部分和问题的更多相关文章
- nyoj 1058部分和问题(DFS)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- NYOJ 1058 部分和问题 【DFS】
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an,推断能否够从中选出若干数.使它们的和恰好为K. 输入 首先,n和k ...
- NYOJ 1058 部分和问题
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...
- nyist oj 1058 部分和问题 (DFS搜索)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an.推断能否够从中选出若干数,使它们的和恰好为K. 输入 首先,n和k ...
- NYOJ之题目1058部分和问题
---------------------------------------- 简单搜索+剪枝 因为考虑到可能会有多个解,所以是将中间过程保存最后才一起打印出来的 AC代码: 1: 2: impor ...
- 经典DFS问题实践
八皇后问题: //八皇后问题 经典的DFS问题实践 #include<iostream> #include<cmath> #include<algorithm> # ...
- HDU 1016 Prime Ring Problem(经典DFS+回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- source Insight注册码
source Insight vesion3.50.0058 注 册码SI3US-361500-17409
- ubantu安装jdk来配置hadoop
1.将jdk-7u5-linux-x64.tar.gz拷贝到/usr/lib/jdk/目录下面,这里如果没有jdk文件夹,则创建该文件夹,命令: sudo mkdir jdk //创建文件夹jdk s ...
- .net中的认证(authentication)与授权(authorization)
“认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 1.认证(authentication) 就是 "判断用户有没有登录?",好比windows系统,没登录就无法使用(不 ...
- GOOGLE搜索秘籍完全公开
一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于19 ...
- PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)
定义字符串的时候,用单引号或者双引号都是可以的.我个人习惯是用双引号.在输出字符串的时候,若字符串中含有字符串变量,使用单引号和双引号则是有区别的.如下面程序: 1 2 3 4 5 6 7 8 < ...
- hdu 4579 Random Walk 概率DP
思路:由于m非常小,只有5.所以用dp[i]表示从位置i出发到达n的期望步数. 那么dp[n] = 0 dp[i] = sigma(dp[i + j] * p (i , i + j)) + 1 . ...
- linux出现bash: ./java: cannot execute binary file 问题的解决办法
问题现象描述: 到orcal官网上下载了两个jdk: (1)jdk-7u9-linux-i586.tar.gz ------------>32位 (2)jdk-7u9-linux-x64.tar ...
- codeforces D
D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...
- Sina App Engine(SAE)入门教程(1)
此教程只针对刚接触SAE的小白用户,资深码农.高手请绕道.首先还是一个经典的实例,hello sae. 创建应用 在注册完账号之后,需要到 http://sae.sina.com.cn/?m=myap ...
- IDEA建项目的正确姿势
今天建多模块的分布式项目的时候折腾死了,可能是建项目的方法不对,最后经过摸索,觉得这样是比较合适的: 首先建一个空的项目:Empty Project,就是项目文件夹 然后在里面建model