查找校验和的整数列表

时间:2016-12-22 09:37:01

标签: arrays algorithm

我需要一个具有以下属性的 n 正整数 L 列表:

  • 对于 L 的每个可能子集 S ,如果我对 S 的所有项目求和,则此总和不在 L < /强>
  • 对于 L 的每个可能子集 S ,如果我对 S 的所有项目求和,则此总和是唯一的(可以识别每个子集)他的总和)

工作示例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

1 个答案:

答案 0 :(得分:6)

作为易于构建的序列,我建议使用 power series ,例如

 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 

例如,22的力量都不是其他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