部分和问题

描述

给定整数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)的更多相关文章

  1. 部分和问题(dfs)

    部分和问题 时间限制:1000 ms  |           内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. ...

  2. DFS、BFS和Backtracking模板

    区别与联系 区别 DFS多用于连通性问题因为其运行思想与人脑的思维很相似,故解决连通性问题更自然,采用递归,编写简便(但我个人不这样觉得...) DFS的常数时间开销会较少.所以对于一些能用DFS就能 ...

  3. UVA11212-Editing a Book(迭代加深搜索)

    Problem UVA11212-Editing a Book Accept:572  Submit:4428 Time Limit: 10000 mSec  Problem Description ...

  4. nyoj 1058部分和问题(DFS)

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  5. 深度优先搜索(DFS)——部分和问题

    对于深度优先搜索,这里有篇写的不错的博客:DFS算法介绍 .总得来说是从某个状态开始,不断的转移状态知道无法转移,然后回到前一步的状态.如此不断的重复一直到找到最终的解.根据这个特点,常常会用到递归. ...

  6. 【子集或者DFS】部分和问题

    题目: 给定整数序列a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k.1≤n≤20   -108≤ai≤108   -108≤k≤108 输入: n=4 a={1,2,4,7} ...

  7. NYOJ 1058 部分和问题 【DFS】

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an,推断能否够从中选出若干数.使它们的和恰好为K. 输入 首先,n和k ...

  8. 部分和问题 南阳acm1058(递归+dfs)

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  9. nyist oj 1058 部分和问题 (DFS搜索)

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 给定整数a1.a2........an.推断能否够从中选出若干数,使它们的和恰好为K. 输入 首先,n和k ...

随机推荐

  1. Update导致SQL Server死锁的典型方法(转载)

    此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个 ...

  2. java实现spark常用算子之ReduceByKey

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...

  3. 转:Git和Github简单教程

    转自:https://www.cnblogs.com/schaepher/p/5561193.html Git和Github简单教程   原文链接:Git和Github简单教程 网络上关于Git和Gi ...

  4. vue入门:(class与style绑定)

    对象语法 数组语法 一.对象语法 1.1对象语法绑定HTML Class 语法:v-bind:class="{'className1':boolean1,'className2':boole ...

  5. php基本变量

    结构体和联合体 struct(结构体) 和 union(联合体) 结构体是8字节对齐,不够8字节的部分则空出来: 联合体共用一个8字节,共享这8字节的内存,后使用的会覆盖先使用的 结构体和联合体在形式 ...

  6. 经典i++和++i问题(附带运算符优先级问题)

    转自 https://blog.csdn.net/mustard1020/article/details/79617865 1.i++和++i的区别     (1)i++简单来说就是先用i的值来参加表 ...

  7. CAN总线简介:如何以编程方式控制汽车

    最近,我正与Voyage公司的朋友合作研究,以实现福特Fusion空调系统(A/C)的编程控制.目前,Voyage公司正努力打造自动驾驶的终极目标:能够以低廉的价格成本和广泛的投放范围,把世界任何地方 ...

  8. facenet中pairs文件制作

    1.对图片进行重命名 """Rename the image based on the folder name""" import os i ...

  9. 数据库——Oracle(3)

    1 排序:对查询返回的结果,根据某一个列或者某几个列的列值大小进行升序或者降序排列. 1)根据某一个列的列值大小进行升序或者降序排列 格式: select 列名/* from 表名 order by ...

  10. for(auto count:counts)

    c++中for(auto count : counts) 这是C++11中的语法,即:Range-based for loop.其中counts应满足:begin(counts), end(count ...