应该使用子集和算法来解决这个问题

时间:2014-01-28 23:00:21

标签: python algorithm recursion

问题是要求我找到添加在一起的列表的所有可能子集(成对,单独或多个)将等于给定数字。我一直在阅读关于子集和问题的很多内容,并且不确定这是否适用于这个问题。

为了解释这个问题,我可以购买最大重量的糖果。 我知道我存储在列表中的十件不同糖果的重量

candy = [ [snickers, 150.5], [mars, 130.3], ......]
I can purchase at most max_weight = 740.5 grams EXACTLY.

因此,我必须找到所有可能的糖果组合,它们将完全等于max_weight。我将在python中编程。不需要确切的代码,只需要它是否是一个子集和问题,以及可能的建议如何继续。

2 个答案:

答案 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]])