问题是要求我找到添加在一起的列表的所有可能子集(成对,单独或多个)将等于给定数字。我一直在阅读关于子集和问题的很多内容,并且不确定这是否适用于这个问题。
为了解释这个问题,我可以购买最大重量的糖果。 我知道我存储在列表中的十件不同糖果的重量
candy = [ [snickers, 150.5], [mars, 130.3], ......]
I can purchase at most max_weight = 740.5 grams EXACTLY.
因此,我必须找到所有可能的糖果组合,它们将完全等于max_weight。我将在python中编程。不需要确切的代码,只需要它是否是一个子集和问题,以及可能的建议如何继续。
答案 0 :(得分:0)
这正是子集求和问题。您可以使用a dynamic programming approach to solve it
答案 1 :(得分:0)
好的,这是一种利用numpy的索引魔法的蛮力方法:
from itertools import combinations
import numpy as np
candy = [ ["snickers", 150.5], ["mars", 130.3], ["choc", 10.0]]
n = len(candy)
ww = np.array([c[1] for c in candy]) # extract weights of candys
idx = np.arange(n) # list of indexes
iidx,sums = [],[]
# generate all possible sums with index list
for k in range(n):
for ii in combinations(idx, k+1):
ii = list(ii) # convert tupel to list, so it can be used as a list of indeces
sums.append(np.sum(ww[ii]))
iidx.append(ii)
sums = np.asarray(sums)
ll = np.where(np.abs(sums-160.5)<1e-9) # filter out values which match 160.5
# print results
for le in ll:
print([candy[e] for e in iidx[le]])