给定一组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)
答案 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)。