部分和问题

给定整数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搜索 尺取)相关推荐

  1. Innumerable Ancestors 尺取 dfs序 lca

    给一棵树,m次查询,每次查询给两个集合,从这两个集合中分别选一个结点,使得这两个结点的lca的深度最大 考虑dfs序为3, 4, 5的三个结点,3和4的lca深度一定大于等于3和5的lca深度 所以可 ...

  2. 蓝桥杯dfs搜索专题

    2018激光样式 #include<bits/stdc++.h> using namespace std;/* dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 可 ...

  3. 蓝桥杯 漏掉的账目明细 DFS搜索 数据处理

    某财务部门结账时发现总金额不对头.很可能是从明细上漏掉了某1笔或几笔.如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗? 如果有多种可能,则输出所有可能的情况. 我们规定:用户输入的第一行是 ...

  4. bfs dfs 搜索入门模板题

    bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...

  5. 洛谷 - P1381 - 单词背诵 - 哈希 - 尺取

    https://www.luogu.org/problemnew/show/P1381 字符串匹配,用哈希总没有错的. 然后就是尺取了,题目要求首先尽可能多覆盖,那么每次尾巴往后面长. 一开始先找到第 ...

  6. POJ 3320 Jessica's Reading Problem (尺取)

    Description 给出一段长度为\(n\)的整数序列,求包含所有出现过的数的连续区间的最小长度. Input 第一行给出序列长度\(n\),第二行给出\(n\)个整数,表示这个序列.\(n \l ...

  7. C语言过河问题主函数,c,c++_C语言踩石头过河问题,用DFS搜索递归了17万次但是没报错,请问是什么原因?,c,c++,算法 - phpStudy...

    C语言踩石头过河问题,用DFS搜索递归了17万次但是没报错,请问是什么原因? 这是原题目,后面附上我的代码,刚刚接触DFS,不是很熟练,求教育--谢谢!!!TUT 这是题目,我大概概括一下 用'※'和 ...

  8. hdu 5424(dfs搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5424 官方题解: 如果图是联通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点 ...

  9. Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)

    排序以后枚举尾部.尺取,头部单调,维护一下就好. 排序O(nlogn),枚举O(n) #include<bits/stdc++.h> using namespace std; typede ...

最新文章

  1. SCCM部署操作系统失败:MP has rejected a request
  2. linux中文件的编辑 写入 读取 光标的位置 以及相应的补充
  3. HD 2955 Robberies(0-1背包)
  4. 我心目中未来的计算机200字,我心目中未来的计算机.doc
  5. 知道自己想要什么,保持自己的节奏。
  6. .NET轻量级配置中心AgileConfig
  7. 深信服防火墙console波特率_乾颐盾之深信服防火墙------初始化教程
  8. TensorFlow 学习(十五)—— tensorflow.python.platform
  9. c/c++ hash表 (哈希表、字典表)
  10. 自学编程到底有多难?
  11. 求职数据分析师岗位,简历应该如何写?|工科生三个月成功转行数据分析心得浅谈
  12. 温湿度传感器的原理与特点
  13. API的理解和使用——全局命令
  14. json csrf html5,Exploiting JSON CSRF
  15. vue js 清除 data数据
  16. pinbox: 我用过最好的收藏工具
  17. 微服务之服务治理相关内容
  18. 51单片机仿真例程-PWM直流电动机
  19. MySQL自动化安装脚本-python版
  20. SQL Server 2012 随时随地管理数据

热门文章

  1. 在DigitalOcean玩Kubernetes(K8S)
  2. 西班牙电信拟出售 60亿欧元资产
  3. 家庭安全摄像头:应选择本地还是云端存储?
  4. Oracle 自己主动内存管理 SGA、PGA 具体解释
  5. 2017华南理工华为杯D bx回文
  6. HTML5 ArrayBufferView之DataView
  7. Centos7下编译安装python2.7.10
  8. DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)...
  9. 数学图形(2.10)一种绕在球上的线圈
  10. BBC News 2012-02-07