给定一个数组和数,求出所有和为给定数的情况(sum和子数组问题)python3实现

	sum和子数组问题即是给定一个数组,求出所有该数组中和等于某个给定值的情况。
	如有以下数组:
s12345
	如果给定一个数为10,那么在该数组中所有和为10的数字的组合为1+4+5, 2+3+5, 1+2+3+4。对于上述问题
我们该如何求解呢?
	这里我们可以用递归的方法进行实现。我们先用一个数组,记录当前值是否取了。如果取了,则该值对应的数组值为true,此
时取了该值的和为新的和即为原来的和加上这个新的数。如果不取,则原来的和不变。
	我们直接来看代码
import random


def sum_list(bool_list, n, now_sum):
    if n >= len(sum_l):
        return
    if now_sum + sum_l[n] == sum_num:       #如果原有值加上这个值正好为所求的数
        bool_list[n] = True                 #将这个数对应的数组值赋值为true
        for i, j in enumerate(bool_list):
            if j:
                print(sum_l[i], end=' ')    #输出所有对应值为true的值
        print()
    bool_list[n] = True                     #如果这个数被选
    sum_list(bool_list, n+1, now_sum+sum_l[n])      #原来的sum和加上新的被选值
    bool_list[n] = False                    #如果没被选
    sum_list(bool_list, n+1, now_sum)        #原来的sum值不变

if __name__ == '__main__':
    sum_l = random.sample(range(15), 8)
    sum_num = 19
    bool_list = [False for i in sum_l]
    print(sum_list(bool_list, 0, 0))

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值