计算组合

时间:2012-12-26 10:28:16

标签: algorithm combinations combinatorics

我很难为下面给出的问题提出解决方案:

我们给出了每个有一个重量的n个盒子(这意味着盒子B_i中的每个球都有重量C_i),

每个盒子特别包含一些球 {b1,b2,b3 ...,b_n}(b_i是方框B_i中的球数)。

我们必须从中选择m个球,使得m个所选球的权重之和小于给定数量T.

有多少种方法可以做到?

2 个答案:

答案 0 :(得分:4)

首先,让我们看一下类似的问题:

类似的问题是:你希望最大化和(这样它仍然小于T),你面临subset-sum problem的变化,即{{3 }}。具有恒定数量项目的变化在此主题中讨论:NP-Hard

查看问题的另一种方法是使用二维Sum-subset with a fixed subset size,其中权重=成本,以及元素数量的额外维度。这个概念在这个主题中讨论:knapsack problem

现在,看看你的问题:找到实现小于/等于T的总和的可能方法的数量仍然是 NP-Hard

假设你有一个多项式算法,让它为A

运行A(T)A(T-1)将为您提供两个数字,如果A(T) > A(T-1),则子集求和问题的答案为true - 否则为{{1}因此,给定这个问题的多项式解,我们可以证明P = NP。

答案 1 :(得分:1)

您可以使用动态编程技术解决它。

f[i][j][k]表示从jB_1选择B_i球的方式数量,其中权重总和完全 {{ 1}}。您想要得到的答案是k

f[n][m][T]

Initially, let f[i][j][k] = 1 for all i,j,k for i = 1 to n for j = 0 to m for k = 0 to T for x = 0 to min(b_i,j) # choose x balls from B_i y = x * C_i if y <= k f[i][j][k] = f[i][j][k] * f[i-1][j-x][k-y] * Comb(b_i,x) 是从Comb(n,k)元素中选择k元素的方法数。

时间复杂度为O(n m T b),其中b是一个方框中的最大球数。

请注意,由于big-O表示法中的n,理论上它是NP难的。但是,实际上,当T相对较小时,该算法仍然可行。