我很难为下面给出的问题提出解决方案:
我们给出了每个有一个重量的n个盒子(这意味着盒子B_i中的每个球都有重量C_i),
每个盒子特别包含一些球 {b1,b2,b3 ...,b_n}(b_i是方框B_i中的球数)。
我们必须从中选择m个球,使得m个所选球的权重之和小于给定数量T.
有多少种方法可以做到?
答案 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]
表示从j
到B_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
相对较小时,该算法仍然可行。