Algorithm 查找列表中要求和的最小值数
因此,如果给我一个排序列表/数组,即[1,6,8,15,40],数组的大小和请求的数字 您如何从该列表中找到所需的最小值数,以将其总和为所需的值数 例如,给定数组[1,6,8,15,40],我请求数字23,它将从列表(8和15)中取2个值来等于23。然后该函数将返回2(#个值)。此外,数组中有无限数量的1(因此您可以使用该函数始终返回一个值)Algorithm 查找列表中要求和的最小值数,algorithm,knapsack-problem,Algorithm,Knapsack Problem,因此,如果给我一个排序列表/数组,即[1,6,8,15,40],数组的大小和请求的数字 您如何从该列表中找到所需的最小值数,以将其总和为所需的值数 例如,给定数组[1,6,8,15,40],我请求数字23,它将从列表(8和15)中取2个值来等于23。然后该函数将返回2(#个值)。此外,数组中有无限数量的1(因此您可以使用该函数始终返回一个值) 感谢您的帮助可能有一个更简单的解决方案,但如果您的列表足够短,您可以尝试每一组值,即: 1-->不是23 6-->不是23 1+6=7-->不是23
感谢您的帮助可能有一个更简单的解决方案,但如果您的列表足够短,您可以尝试每一组值,即:
- 1-->不是23
- 6-->不是23
- 1+6=7-->不是23
- 1+8=9-->不是23
- 1+40=41-->不是23
- 6+8=14-->不是23
- 8+15=23-->哦,看,是23,我们加了2个值
import functools
S = [1, 6, 8, 15, 40] # must contain only positive integers
@functools.lru_cache(maxsize=None) # memoizing decorator
def min_subset(k, s):
# returns the minimum size of a subset of S[:k] summing to s, including any extra 1s needed to get there
best = s # use all ones
for i, j in enumerate(S[:k]):
if j <= s:
sz = min_subset(i, s-j)+1
if sz < best: best = sz
return best
print min_subset(len(S), 23) # prints 2
导入工具
S=[1,6,8,15,40]#必须只包含正整数
@functools.lru_缓存(maxsize=None)#记忆装饰器
定义最小值子集(k,s):
#返回S[:k]求和到S的子集的最小大小,包括到达该子集所需的任何额外1
best=s#使用所有的
对于枚举(S[:k])中的i,j:
如果j