所有组合的产品总和与每组中的一个元素

时间:2010-01-19 23:21:49

标签: algorithm subset

鉴于我有非空的不同集合(标记为Z [1],Z [2],...,Z [m]),我的目标是计算所有可能的子集的总和,其中只有一个每组中的元素。每个子集的大小定义为其成员的产物。例如:

Z[ 1 ] = {1,2,3}

Z[ 2 ] = {4,5}

Z[ 3 ] = {7,8}

应该导致:

1*4*7 + 1*4*8 + 1*5*7 + 1*5*8 + 2*4*7 + 2*4*8 + 2*5*7 + 2*5*8 + 3*4*7 + 3*4*8 + 3*5*7 + 3*5*8 = 810

虽然这很容易编码(使用任何语言),但这是对着名的subset sum problem的重述吗?如果没有,请提供一个多项式时间算法来计算这个总和(伪代码或python首选!)。如果不存在多项式时间算法,请解释原因。

2 个答案:

答案 0 :(得分:4)

很容易看出(1 + 2 + 3)*(4 + 5)*(7 + 8)= 810。

>>> from operator import mul
>>> from functools import reduce
>>> z = [{1,2,3}, {4,5}, {7,8}]
>>> s = reduce(mul, (sum(zz) for zz in z))
>>> s
810

What's the Python function like sum() but for multiplication? product()?

我个人认为Guido对mul做出了一个糟糕的决定。

答案 1 :(得分:0)

>>> z1 = [1, 2, 3]
>>> z2 = [4, 5]
>>> z3 = [7, 8]
>>> s = 0
>>> for a in z1:
        for b in z2:
            for c in z3:
                s += a*b*c      
>>> s
810