部分和问题(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 ...
随机推荐
- c#获取桌面路径和bin文件的路径
string path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory): 生成的运行bin文件下的路径: ...
- es6函数扩展(+ ...扩展运算符)
1.参数默认值 function foo(param = 'nihao'){ console.log(param); } foo('hello kitty'); 2.参数解构赋值 function f ...
- springboot搭建web项目与使用配置文件
目录 一.准备工作 二.创建基础web项目 1. maven配置 2.创建maven项目.配置pom.xml为web基础项目 3.编写启动类 4.使用maven打包 5.使用命令java -jar x ...
- layDate面板出现红色花纹图案
要使用layDate,有两种方法: 1. 要么在引用layui.js和layui.css,然后通过layui.use('laydate', callback) 加载模块后,调用方法使用. 2. 去la ...
- mysql之使用json
从mysql 5.7开始才有 创建表(含有json类型) CREATE TABLE `emp_details` ( `emp_no` int(11) NOT NULL, `details` json ...
- 基于UDS的BootLoader
bootloader程序架构略有简化的bootloader图 这张图和恒润教程中的BootLoader流程大体是一致的. 疑问点 Q:图中的烧写顺序是34-36-34-36-34-36-37,但另一些 ...
- POI读取Excel如何判断行为空
public static boolean isRowEmpty(Row row) { for (int c = row.getFirstCellNum(); c < row.getLastCe ...
- lVS/haproxy
haproxy 安装配置 1. 下载及安装 wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.21.tar.gz tar zxvf h ...
- jquery实现input输入框点击加减数值随之变动
<input class="addBtn min" type="button" value="-" /><input cl ...
- jenkins发送jemter邮件附件格式配置
原文:https://www.cnblogs.com/chenchen-tester/p/6930200.html build.xml <?xml version="1.0" ...