2016-12-22 62 views
3

我需要的ň正整數大號列表,具有以下特點:找到整數列表的校驗和

  • 對每個可能的子集小號大號,如果我綜上所述小號的所有項目,這個總和不大號
  • 對於每個可能子集的小號大號,如果我總結小號的所有項目,這個總和是唯一的(每個子集可以通過他的總和確定的)

工作實施例1:

n = 4 
L = [1, 5, 7, 9] 

check: 
1+5 = 6 ok 
5+7 = 12 ok 
7+9 = 16 ok 
9+1 = 10 ok 
1+7 = 8 ok 
5+9 = 14 ok 

1+5+7 = 13 ok 
5+7+9 = 21 ok 
1+5+9 = 15 ok 
1+7+9 = 17 ok 

1+5+7+9 = 22 ok 

All sums are unique -> L is OK for n = 4 
+0

你爲什麼不試試質數? –

+1

@WasiAhmad只使用素數並不保證它。例如,5 + 13 = 7 + 11。 – njlarsson

+0

「對於L的每個可能的子集S,如果我將S的所有項相加,則該總和不在L中」如果該子集僅包含一個元素,該怎麼辦?從你的例子看來,你只考慮具有2個或更多元素的子集?請確認。 –

回答

6

作爲容易構造序列,我建議使用電源系列,例如

1, 2, 4, 8, ..., 2**k, ... 
1, 3, 9, 27, ..., 3**k, ... 
1, 4, 16, 64, ..., 4**k, ... 
... 
1, n, n**2, n**3,..., n**k, ... where n >= 2 

採取的,例如,2:的2力量也不是其他2功率的總和;通過轉換sum成二進制表示法給出一個sum(數量),你可以很容易找到的子集:

23 = 10111 (binary) = 2**0 + 2**1 + 2**2 + 2**4 = 1 + 2 + 4 + 16 

在一般情況下,一個簡單的貪心算法會做:給定一個sum減去最大項小於或等於到sum;繼續減去零:

n = 3 
sum = 273 

273 - 243 (3**5) = 30 
    30 - 27 (3**3) = 3 
    3 - 3 (3**1) = 0 

273 = 3**5 + 3**3 + 3**1 = 243 + 27 + 3 
+0

很好的答案..! –