部分和问题(dfs)
部分和问题
描述
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 13
1 2 4 7
样例输出
YES
2 4 7
//不保存符合条件的每一个数
#include<iostream>
int a[];
int n,k;//全局变量
using namespace std;
bool dfs(int i,int sum){//已经从前i项得到了和sum,然后从i项之后进行深度搜索
if(i==n+)
return sum==k; //如果前n项都计算过了,则返回并判断sum是否与K相等
if(dfs(i+,sum))//不加a[i]的情况
return true;
if(dfs(i+,sum+a[i]))//加上a[i]的情况
return true;
return false; //无论加上a[i]还是不加上a[i]都不能使得sum==k,则返回flase
}
int main(){
cin>>n>>k;
for(int i=;i<=n;i++)
cin>>a[i];
if(dfs(,))//从1开始,因为题目中1<=n<=20
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return ;
}
//深度优先搜索从最开始的状态出发,遍历所有可以达到的状态,由此可以对所有的状态进行操作,或列举出所有的状态
保存并输出符合条件的数据:
#include<iostream>
int a[],b[]={};//b[25]初始化零,用于标记符合条件的数据
int n,k;
using namespace std;
int dfs(int i,int sum)
{
if(i==n+1&&sum==k)
return ;
if(i==n+1&&sum!=k)
return ;
b[i]=;//标记为0,数据不符合
if(dfs(i+,sum))
return ;
b[i]=;//标记为1,数据符合
if(dfs(i+,sum+a[i]))
return ;
return ;
}
int main()
{
while(cin>>n>>k){
int p=;
for(int i=1; i<=n; i++)
cin>>a[i];
if(dfs(,)){
cout<<"YES"<<endl;
for(int i=1; i<=n; i++){
if(b[i])
cout<<a[i]<<" ";
}
cout<<endl;
}
else
cout<<"NO"<<endl;
} return ;
}
测试结果:

部分和问题(dfs)的更多相关文章
- 部分和问题(dfs)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. ...
- DFS、BFS和Backtracking模板
区别与联系 区别 DFS多用于连通性问题因为其运行思想与人脑的思维很相似,故解决连通性问题更自然,采用递归,编写简便(但我个人不这样觉得...) DFS的常数时间开销会较少.所以对于一些能用DFS就能 ...
- UVA11212-Editing a Book(迭代加深搜索)
Problem UVA11212-Editing a Book Accept:572 Submit:4428 Time Limit: 10000 mSec Problem Description ...
- nyoj 1058部分和问题(DFS)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- 深度优先搜索(DFS)——部分和问题
对于深度优先搜索,这里有篇写的不错的博客:DFS算法介绍 .总得来说是从某个状态开始,不断的转移状态知道无法转移,然后回到前一步的状态.如此不断的重复一直到找到最终的解.根据这个特点,常常会用到递归. ...
- 【子集或者DFS】部分和问题
题目: 给定整数序列a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k.1≤n≤20 -108≤ai≤108 -108≤k≤108 输入: n=4 a={1,2,4,7} ...
- NYOJ 1058 部分和问题 【DFS】
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an,推断能否够从中选出若干数.使它们的和恰好为K. 输入 首先,n和k ...
- 部分和问题 南阳acm1058(递归+dfs)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- nyist oj 1058 部分和问题 (DFS搜索)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an.推断能否够从中选出若干数,使它们的和恰好为K. 输入 首先,n和k ...
随机推荐
- O035、Nova Suspend / Rescue 操作详解
参考https://www.cnblogs.com/CloudMan6/p/5503501.html Suspend / Resume 有时候需要长时间暂停 instance , 可以通过 S ...
- 微信小程序常用事件
bind bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. bindtap 跳转页面 bindchange .value 改变时触发 change 事件 bi ...
- 测试使用Timer定时调用http接口
转自:https://blog.csdn.net/qq_36004521/article/details/80101881
- Windows命令行命令总结
转载地址:https://www.cnblogs.com/accumulater/p/7110811.html 1. gpedit.msc-----组策略 2. sndrec32-------录音 ...
- firefox(火狐中的兼容问题总结)
1.firefox 下 默认情况 <input type="number"> 只允许整数其他的都会报错,红色提示: 这时候可以添加参数 step="0.0 ...
- windows 下 node 入门
node js node -v npm -v nvm v nvm list npm install * -g npm install express -g npm install -g expres ...
- 【异常】Caused by: org.apache.phoenix.coprocessor.HashJoinCacheNotFoundException:
1 详细异常 Caused by: org.apache.phoenix.coprocessor.HashJoinCacheNotFoundException: ERROR 900 (HJ01): H ...
- java8学习之Function与BiFunction函数式接口详解
Function接口: 上次中已经使用了Function的apply()方法,但是在这个接口中还存在三个具体实现的方法,如下: 下面来仔细的将剩下的方法学习一下: compose(): 首先来读一下该 ...
- CSS如何水平垂直居中?
CSS如何水平垂直居中? 1.CSS如何实现水平居中? margin: 0 auto 2.CSS如何实现水平垂直居中? 首先设置一个div元素,设置背景颜色以便看出变化.代码如下: <!DOCT ...
- Tomcat管理页面
下面就是 Manager的界面: Server Status 上面个两个配置任意一个配置好了后,都可以启用Server Status的GUI界面: