【发布时间】:2010-01-20 07:39:52
【问题描述】:
鉴于我有 m 个非空的不同集合(标记为 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!)。如果不存在多项式时间算法,请解释原因。
【问题讨论】:
-
这是作业,对吧?
-
以 m 表示的多项式?还是所有 Z 中的元素总数?
-
@Ipthnc - 这不是一个家庭作业问题,而是我遇到的一个真正的基于物理的问题。假设您有许多封闭的不同系统(Z1、Z2、...)都耦合到同一个水库(在固定 T 处)。现在只观察每个系统一次,通过这些观察,水库最可能的 T 是多少?我将其重述为一个计算问题,希望 CS 专业的学生比我有更深入的了解。
-
@recursive - 以 m 表示的多项式,我们假设 Z_i 的平均大小是有界的。
-
天哪,可观察的水库......我的头已经很痛了。