繁体   English   中英

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

[英]count number of subsets with atmost k distinct elements

给定一组整数,计算具有最多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)

让我们将值集压缩为S = [1:2, 2:1, 3:2] ,在这里您只需保存每个元素的值和计数并为其分配一些顺序。 令n为序列S的大小。然后,您将有2个计数选择每个值的子集的可能性。

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

这产生了以下DP方法:假设仅允许使用k个不同的值,则f(i,k)是从索引i开始进行决策的方式的数量。

复发是

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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM