簡體   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