問題陳述如下: 鑑於N
。我們需要找到x1
,x2
,..
,xp
,使得N = x1 + x2 + .. + xp
,p必須是最小值(意味着總和中的項的數量),並且我們還必須能夠從總和中獲得從1到(N-1)的所有數字(x1,x2,x3 ... xp)的子集中,並且集合中的數字也可以重複。算法獲得與最小數量的條款
例如,如果N = 7。
7 = 1+2+4
而6= (2,4)
,5= (4,1)
,4 = (4)
,3=(1,2)
等。
實施例2: 8 = 1+2+4+1
實施例3:(無效) 8 = 1 + 2 + 5 但是,我們不能從(1,2,5)。所以子集得到4(1 ,2,5)不是有效的組合
我的方法是,如果'N-1'可以寫成p項的總和而'N'或者有p或p + 1項。但是這種方法將需要檢查總和爲「N-1」並具有「p」項的所有可能的組合。除此之外,任何人都可以有更好的解
解決方案:
第一步: 假設我們有我們的一套作爲我們的答案「K」的條目。因此,我們可以從這些數字中獲得2^K個不同數量的總和,因爲每個條目都會出現或不出現在總和中。而且如果數字是「N」,我們需要計算'1'到'N'的和。因此
(2^K -1)= N
K =日誌(N + 1)
第二步:
的第一步後,我們知道,我們的回答必須包括 「K」 的項,但這些有什麼實際的條目是?假設我們的條目是(a1,a2,a3 ... ak)。所以編號P可以寫爲 P = a1 * b1 + a2 * b2 + a3 * b3 .... + ak * bk。在這裏,我們可以看到P是二進制數的一個十進制表示(b1 b2 b3 bk),因此我們可以取一個[i] = 2 ^(i-1)。
如上所述,您的算法對於大多數數字不可行。例如,對於數字8,不可能構建一組*獨特的*數字,使得它們加起來爲8,並且可以合併以使每個數字從1到8.事實上,只有少於一個的數字是可能的比二的力量。 – llb
我們可以寫8爲1 + 2 + 4 + 1。對? – Manish
@Manish - 如果你被允許重複條件,那麼問題就會減少到列表x1 = 1。顯然,我們可以產生任何數字,可以重複添加1 ... –