Divide $1048 (in whole $ increments) into a number of bags so that I can ask for any amount between $1 and $1048, and you can give me the proper amount by giving me a certain number of these bags without opening them.
What is the minimum number of bags you will require?
通过二叉树的方式做出来了
1048 = 524 + 524
524 = 262 + 262
262 = 131 + 131
131 = 1 + 130 (这里应该算重点,为何要拆成1+x的形式。当时主要考虑到除以二是最快的分法,而且1是必要的原子,就分了)
130 = 65 + 65
65 = 5 + 60 (思路二:拆成最近的原子+偶数的形式,显然2+63不适合;而3+62的原子3太大,最好用1、2来凑,所以先写成5+60)
60 = 30 + 30
30 = 2 + 28 (为何不是15+15?考虑到快要到最小值了,可能拼出1、2最重要)
28 = 14 + 14
14 = 4 + 10 (最开始用的14 = 7 + 7,7 = 3+4,这样算出来的答案是12个,不对,然后回过去修改,发现4+10可以做到更少,就改了)
蓝色标注的就是最后的分法
显然,这种题目应该有相应的数学模型,ACM接触不多,不太清楚。自己抽象一下:
条件:对任意的正整数n,拆成任意数和的形式,拆出来的数姑且称为原子。
要求:这些原子要能表示1-n 之间的任意整数,求原子的最小个数。
形式化描述:
已知:a = a1 + a2 + ... + an
对任意的b,1<= b <= a,都能表示为a1-an中某几项和的形式
求n的最小值
要是有知道的同学,请赐教