[算法]子数组之和问题

这篇博客探讨了在给定整数数组和目标和的情况下,如何计算满足条件的子数组组合数目。作者通过0-1背包问题的视角,提出了几种解决方法,包括处理负数、数组中重复元素的情况,并提供了不同实现的代码示例。文章提到,对于大型数据,可能需要考虑存储效率更高的数据结构,如使用map代替连续数组。
摘要由CSDN通过智能技术生成

问题描述:给定一个含有n个元素的整形数组a,再给定一个和target,求出数组中满足给定和的所有元素组合的数目。举个例子,设有数组a[5] = { 1, 2, 3, 4, 5},sum = 8,则满足和为8的组合数为3,即{1,2,5}, {1,3,4}, {3, 5}。

http://www.cnblogs.com/graphics/archive/2011/07/14/2105195.html

链接处有个类似的题目,不过要求给出所有的组合情况,楼主采用穷举和回溯两种方法求解。这里只需要求解组合数目,所以可以更简单一点。


对于n个元素的数组,考虑所有的组合情况就是2^n种,即对于每个元素可以选或者不选,有点像0-1背包问题,不过目标不是最大化价值。

我们来看看这个问题可否划分子问题,当我们考虑第i个元素是否选择时,前i-1个元素的组合情况也就是不选i时的组合情况,现在我们考虑i,如果前i-1个数字可以组合出的和有s1,s2,...,st,那么考虑i时,即前i个元素可以组合出的和有i+s1,i+s2,...,i+st。如果我们把每个和的组合情况记录下来,那么再考虑每个元素选或不选的时候就可以直接累加组合出该sum值的情况数。

代码1如下:

// All numbers in the vector 'nums' are positive
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值