算法-动态规划1
问题描述
给定一个数组arr和一个目标值S,计算数组中是否可以挑出任意个元素的和为S,若有返回false,若无返回true。
代码
python实现
import numpy as np
arr = [3, 34, 4, 12, 5, 2]
# s为目标值
# 递归写法
def rec_subset(arr, i, s):
# 找出口
# 1.目标值为0
# 2.i为0
# 3.
if s == 0:
return True
elif i == 0:
return arr[0] == s
elif arr[i] > s:
return rec_subset(arr, i - 1, s)
else:
A = rec_subset(arr, i - 1, s - arr[i])
B = rec_subset(arr, i - 1, s)
return A or B
# 动态规划算法
# 用二位数组来存取
def dp_subset(arr, S):
subset = np.zeros((len(arr), S + 1), dtype=bool)
subset[:, 0] = True
subset[0, :] = False
subset[0, arr[0]] = True
for i in range(1, len(arr)):
for s in range(1, S + 1):
if (arr[i] > s):
subset[i, s] = subset[i - 1, s]
else:
A = subset[i - 1, s - arr[i]]
B = subset[i - 1, s]
subset[i, s] = A or B
r, c = subset.shape
return subset[r - 1, c - 1]
print(rec_subset(arr, 5, 9))
print(rec_subset(arr, 5, 10))
print(rec_subset(arr, 5, 11))
print(rec_subset(arr, 5, 12))
print(rec_subset(arr, 5, 13))
print(dp_subset(arr, 9))
print(dp_subset(arr, 10))
print(dp_subset(arr, 11))
print(dp_subset(arr, 12))
print(dp_subset(arr, 13))