动态规划系列(4)——子列表的和是否等于某一个数

这篇博客介绍了如何利用动态规划解决一个复杂问题:给定一个列表和一个数S,判断列表中是否存在子列表的和等于S。通过从列表末尾开始,考虑选择或不选择当前元素,构建状态转移方程,并用二维数组保存每个状态的结果,最终确定是否存在符合条件的子列表。递归和动态规划的解决方案也在文中给出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

油管上讲的最清晰的

这个问题是比较复杂的问题,假设存在一个列表,并给定一个数S,判断该列表中是否存在数的和为数S。和之前的动态规划类似,我们先从最后一位往前算,还是选择不选择的问题。考虑方程,如果选择最后一位,则看前一位的状态是否可以求出和为(S-最后一位数);如果不选择最后一位,则看前一位的状态是否可以求出和为S,最后只要选择和不选择的情况下只要一个True即可。

即下面的公式

考虑一下出口问题,如果当s为0时,说明此时肯定已经找到了,返回True;如果当i为0时,此时判断arr[0]等于s与否即可,如果不等于则输出False,等于输出True;针对上述的状态方程,还有一种情况需要考虑,如果arr[i]大于s,此时 直接考虑前面一位是否存在和为s即可。

递归解决的思路按照上述的思路即可解决,代码如下:

# -*- coding: utf-8 -*-
'''
给定一个数组和一个数字,判断这个数组中是否有数字的和为这个数字,是返回True,否返回False
'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值