部分和问题 (dfs搜索 尺取)
部分和问题
给定整数a1, a2, a3, a4, .......... , an ,判断是否可以从中取出若干个数,使得他们的和恰好为k 。
1 <= n <= 20
测试数据:n = 4
a[] = {1, 2, 4, 7}
k = 13
这道题数据范围较小,可以用DFS取暴力搜
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>using namespace std;int a[25];
int n, k;bool dfs(int i, int sum){if(i == n) return sum == k;if(dfs(i+1, sum)) return true;if(dfs(i+1, sum + a[i])) return true;return false;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; i++) scanf("%d", &a[i]);scanf("%d", &k);if(dfs(0, 0)) printf("Yes\n");else printf("No\n");
}
如果能够组成既定的和,则打印出被选择的数字
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>using namespace std;int a[25];
int n, k, cnt = 0;
int res[25];bool dfs(int i, int sum){if(i == n) return sum == k;if(dfs(i+1, sum)) return true;if(dfs(i+1, sum+a[i])){res[cnt++] = a[i];return true;}return false;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; i++) scanf("%d", &a[i]);scanf("%d", &k);if(dfs(0, 0)){printf("Yes\n");for(int i = 0; i < n; i++) printf("%d ", res[i]);printf("\n");}else printf("No\n");return 0;
}
问题变形:一个序列中有n个数,问是否存在最小的num(选取的数字个数)使得和大于k,存在输出 "Yes", 否则,输出“No”。
修改:如果n的值特别大时,例如 n = 100 时,如果用DFS的话,会爆栈。所以 要用一种方式去解决这一问题。可以用尺取的方法来做
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>using namespace std;const int maxn = 1e6+5;int a[maxn];
int n, k;int main()
{scanf("%d%d", &n, &k);for(int i = 0; i < n; i++) scanf("%d", &a[i]);int l = 0, r = 0, sum = 0, flag = 0;while(1){while(t < n&&sum < k) sum += a[r++];if(sum < S) break;res = min(res, r-l);sum -= a[s++];}if(res > n) printf("Yes\n");else printf("No\n");return 0;
}
部分和问题 (dfs搜索 尺取)相关推荐
- Innumerable Ancestors 尺取 dfs序 lca
给一棵树,m次查询,每次查询给两个集合,从这两个集合中分别选一个结点,使得这两个结点的lca的深度最大 考虑dfs序为3, 4, 5的三个结点,3和4的lca深度一定大于等于3和5的lca深度 所以可 ...
- 蓝桥杯dfs搜索专题
2018激光样式 #include<bits/stdc++.h> using namespace std;/* dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 可 ...
- 蓝桥杯 漏掉的账目明细 DFS搜索 数据处理
某财务部门结账时发现总金额不对头.很可能是从明细上漏掉了某1笔或几笔.如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗? 如果有多种可能,则输出所有可能的情况. 我们规定:用户输入的第一行是 ...
- bfs dfs 搜索入门模板题
bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...
- 洛谷 - P1381 - 单词背诵 - 哈希 - 尺取
https://www.luogu.org/problemnew/show/P1381 字符串匹配,用哈希总没有错的. 然后就是尺取了,题目要求首先尽可能多覆盖,那么每次尾巴往后面长. 一开始先找到第 ...
- POJ 3320 Jessica's Reading Problem (尺取)
Description 给出一段长度为\(n\)的整数序列,求包含所有出现过的数的连续区间的最小长度. Input 第一行给出序列长度\(n\),第二行给出\(n\)个整数,表示这个序列.\(n \l ...
- C语言过河问题主函数,c,c++_C语言踩石头过河问题,用DFS搜索递归了17万次但是没报错,请问是什么原因?,c,c++,算法 - phpStudy...
C语言踩石头过河问题,用DFS搜索递归了17万次但是没报错,请问是什么原因? 这是原题目,后面附上我的代码,刚刚接触DFS,不是很熟练,求教育--谢谢!!!TUT 这是题目,我大概概括一下 用'※'和 ...
- hdu 5424(dfs搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5424 官方题解: 如果图是联通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点 ...
- Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)
排序以后枚举尾部.尺取,头部单调,维护一下就好. 排序O(nlogn),枚举O(n) #include<bits/stdc++.h> using namespace std; typede ...
最新文章
- SCCM部署操作系统失败:MP has rejected a request
- linux中文件的编辑 写入 读取 光标的位置 以及相应的补充
- HD 2955 Robberies(0-1背包)
- 我心目中未来的计算机200字,我心目中未来的计算机.doc
- 知道自己想要什么,保持自己的节奏。
- .NET轻量级配置中心AgileConfig
- 深信服防火墙console波特率_乾颐盾之深信服防火墙------初始化教程
- TensorFlow 学习(十五)—— tensorflow.python.platform
- c/c++ hash表 (哈希表、字典表)
- 自学编程到底有多难?
- 求职数据分析师岗位,简历应该如何写?|工科生三个月成功转行数据分析心得浅谈
- 温湿度传感器的原理与特点
- API的理解和使用——全局命令
- json csrf html5,Exploiting JSON CSRF
- vue js 清除 data数据
- pinbox: 我用过最好的收藏工具
- 微服务之服务治理相关内容
- 51单片机仿真例程-PWM直流电动机
- MySQL自动化安装脚本-python版
- SQL Server 2012 随时随地管理数据
热门文章
- 在DigitalOcean玩Kubernetes(K8S)
- 西班牙电信拟出售 60亿欧元资产
- 家庭安全摄像头:应选择本地还是云端存储?
- Oracle 自己主动内存管理 SGA、PGA 具体解释
- 2017华南理工华为杯D bx回文
- HTML5 ArrayBufferView之DataView
- Centos7下编译安装python2.7.10
- DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)...
- 数学图形(2.10)一种绕在球上的线圈
- BBC News 2012-02-07