递归求解子集和问题的思路

子集和问题:
给定一个集合S和一个目标值t,求问是否能从S中找出一个子集,使得这个子集元素之和等于目标值t

假设有一个集合S = {-1, 2, 7, 10},一个目标值t = 8。那么我们可以找到S的一个子集S1 = {-1, 2, 7} 各项之和等于8。

解决子集和问题的基本思路是 The inclusion/exclusion pattern,即判断某个元素element是否应该被包含在组成目标值的子集和中。如果子集和问题有解,一般有两种方式来处理这个元素:该元素被包含,那么集合S剩下的元素可以组成t - element ;该元素被排除,那么集合S剩下的元素可以组成t

因此函数可写为:

bool subsetSumExists(set<int> &s, int target){if (set.isEmpty()) {return target==0;} else {int element = s.first();set<int> rest = s - element;return subsetSumExists(rest, tartget) ||subsetSumExists(rest, target-element);}
}

最基本的情况是当集合为空集时,只有目标值为0才可能。后面的部分只是在重复分叉判断某元素是否在子集和中。

这里以集合S = {-1, 2, 7, 10},目标值t = -1 为例:

Subset-Sum Problem 子集和问题相关推荐

  1. 动态规划法(三)子集和问题(Subset sum problem)

      继续讲故事~~   上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定.之后,他就决心去大城市闯荡了,看一看外面更大的世界.   这天,丁丁刚回到家,他 ...

  2. Subset sum problem

    给一个整数集合s和一个整数n,请问s中是否存在一个子集合,这个集合里的元素和 等于 n 采用动态规划进行求解: 1. 设集合x的最小和以及最大和分别是min,max,设一个二维数组 m[n][max- ...

  3. NYOJ 927 The partial sum problem 【DFS】+【剪枝】

    The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 One day,Tom's girlfriend give him a ...

  4. c语言sum出错,ACM:Sum Problem 求和问题C语言源码

    学习过程中,将写内容过程中重要的一些内容片段备份一下,如下内容段是关于ACM:Sum Problem 求和问题C语言的内容,应该是对码农们有一些用途. #include using namespace ...

  5. HDU.1001 Sum Problem

    原题 HDU.1001 Sum Problem 分类 杂题 题意 计算从1到正整数n的累加和. 输入/输出 要求与格式 输入内容 每行输入一个正整数 输出结果 结果为累加和 输出格式 每个输出结果独占 ...

  6. hdu 2058 解题报告 - The sum problem

    hdu 2058 解题报告 - The sum problem 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2058 等差求和公式: Sn=(a1+aN ...

  7. leetcode 416. Partition Equal Subset Sum | 416. 分割等和子集(Java)

    题目 https://leetcode.com/problems/partition-equal-subset-sum/ 题解 乍一看是背包问题,但不同的是,本题要求结果等于某值,背包要求结果小于某值 ...

  8. LeetCode Partition Equal Subset Sum(动态规划)

    问题:给出一个数组,问是否可以分成两个子集,其和相等 思路:首先要求数组和是偶数,然后用动态规划来求. 用dp(i,j)表示第i步时和为j是否可行,则有dp(i,j)= dp(i-1,j) || dp ...

  9. leetcode416. Partition Equal Subset Sum

    题目要求 Given a non-empty array containing only positive integers, find if the array can be partitioned ...

最新文章

  1. 关于拆分活动页为独立仓库的一点思考
  2. Java面试中,一些常见的有关多线程问题!
  3. linux修改组的选项名字为,Linux用户、组及权限管理浅析
  4. 长沙理工大学计算机网络试题,长沙理工大学考试试卷(计算机网络)要点.docx
  5. HTML5 Canvas 画虚线组件
  6. bootstraptable设置行高度_【短柱专题】窗台板为什么要通长设置
  7. 编历修改工作表中的控件属性(更新条形码)
  8. MySql 5.6 Packet for query is too large
  9. 思科vrf配置实例_从原理到配置,最全的VLAN说明就在这了!
  10. 互联网后端的主流编程语言是啥?不是Python?
  11. ZUCC计算机网络 网络层(一)
  12. 软件图形用户界面设计
  13. win11x64 与HP1020打印机适配不成功
  14. 计算机组装室标语,TheShy的座位这么真实?电脑上的标语吸睛,网友看后笑出声...
  15. 计算机系统文件夹打不开,电脑系统的文件夹打不开可以试下这两个办法
  16. lisp 梯形展开图_利用AutoCAD平台的Autolisp程序语言做复杂建模
  17. 被谷歌出卖定位信息成“嫌疑犯”,花了大价钱才避免窦娥冤 | 一个自行车爱好者自述...
  18. canvas绘图在高清屏显示模糊
  19. [转]浅说软件需求分析
  20. 主页(一)01-搜索栏-顶部搜索栏布局

热门文章

  1. 解决bug_赛博朋克2077BUG卡关怎么办?卡关BUG解决办法
  2. java udp 多播 广播_Java UDP 广播与多播
  3. php编程查错,盘点PHP编程常见失误
  4. python 、example
  5. TensorFlow 莫烦 手写识别 cross_entry (五)
  6. 123. Leetcode 72. 编辑距离 (动态规划- 字符串系列)
  7. 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)
  8. 通过先序和中序数组生成后续数组
  9. 190. Reverse Bits
  10. 点云网络的论文理解(一)-点云网络的提出 PointNet : Deep Learning on Point Sets for 3D Classification and Segmentation