计算具有最多k个不同元素的子集的数量

时间:2014-05-07 18:00:30

标签: algorithm set subset combinatorics

给定一组inetegers,计算具有最多k个不同元素的子集数量。
例如:set为{1,1,2,3,3},k = 2:

可能的子集是:
{} - 空集
{1}
{1}
{2}
{3}
{3}
{1,1}
{1,2}
{1,3}
{1,3}
{1,2}
{1,3}
{1,3}
{2,3}
{2,3}
{1,1,2}
{1,1,3}
{1,1,3}
{1,3,3}
{1,3,3}
{2,3,3}
{1,1,3,3}
我的解决方案是迭代所有可能的子集并检查是否有更少的k + 1个元素..但它太慢了.. O(2 ^ n)

1 个答案:

答案 0 :(得分:2)

让我们将您的值集压缩为类似S = [1:2, 2:1, 3:2]的表示,您只需保存每个元素的值和计数,并为它们分配一些顺序。设n为序列S的大小。然后,您有2 ^个计数可能为每个值选择一个子集。

对于每个小组,您必须决定是否接受。如果你接受它,不同值的数量会增加,你有2 ^ count - 1种可能性。如果不是,则不同值的数量保持不变。

这产生了以下DP方法:设f(i,k)是从索引i开始做出决策的方式的数量,假设您只允许使用k个更多不同的值。

重复发生

f(n, k) = 1   if k >= 0
f(n, k) = 0   if k < 0
f(i, k) = f(i + 1, k) + (2^count[i] - 1) * f(i + 1, k - 1)

导致O(n * k)算法。结果将是f(0,k)。