• Logic Puzzle Challenge 2


    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的最小值

    要是有知道的同学,请赐教

     

     

  • 相关阅读:
    倒序三角形
    有时间了
    测试一个数是不是素数
    初学C++编写小程序
    N!的递归调用
    1+...+5的递归调用
    1!+....+5!
    菱形块
    23.git简单使用
    27.flask学习
  • 原文地址:https://www.cnblogs.com/handt/p/2605175.html
Copyright © 2020-2023  润新知