这个问题是比较复杂的问题,假设存在一个列表,并给定一个数S,判断该列表中是否存在数的和为数S。和之前的动态规划类似,我们先从最后一位往前算,还是选择和不选择的问题。考虑方程,如果选择最后一位,则看前一位的状态是否可以求出和为(S-最后一位数);如果不选择最后一位,则看前一位的状态是否可以求出和为S,最后只要选择和不选择的情况下只要一个True即可。
即下面的公式
考虑一下出口问题,如果当s为0时,说明此时肯定已经找到了,返回True;如果当i为0时,此时判断arr[0]等于s与否即可,如果不等于则输出False,等于输出True;针对上述的状态方程,还有一种情况需要考虑,如果arr[i]大于s,此时 直接考虑前面一位是否存在和为s即可。
递归解决的思路按照上述的思路即可解决,代码如下:
# -*- coding: utf-8 -*-
'''
给定一个数组和一个数字,判断这个数组中是否有数字的和为这个数字,是返回True,否返回False
'''