美文网首页
1百块钱买1百颗糖果的问题

1百块钱买1百颗糖果的问题

作者: 阿春_abcdlcq | 来源:发表于2018-03-15 13:23 被阅读0次

    高级糖果5块钱1颗,中级糖果3块钱1颗,低级糖果1块钱3颗,问100块钱买100颗糖果,应该怎么买?要求每种糖果都必须有。

    这是个数学问题,从数学的角度去解决算法问题,有助于我们降低时间复杂度。设高级糖果x颗、中级y颗、低级z颗,可以得出2个方程:

    x+y+z=100

    5x+3y+z/3=100,且x、y、z是正整数,z是3的倍数

    我们可以初步定一下x、y、z的范围,每种糖果都必须有,很显然x、y都≥1,z≥3,第1个式子对确定x、y范围没什么作用,都特别大,z≤96。从第2个式子可以看出,x≤19,y≤31,z太大忽略。因此就有

    1≤x≤19,1≤y≤31,3≤z≤96。是不是算法采用x循环最好,还不一定呢。

    我们再回过来处理这2个方程,将z消掉后可以得到一个二元一次方程,

    7x+4y=100

    这是一条在x、y平面上的直线,我们的解就在这条直线上,继续确定范围x≤13,y≤23。如果采用x循环,就有

    y = (100-7x)/4=25-7x/4

    z = 100-y-x

    有个问题,解y的时候出现了除,这可不是什么好事,可能出现浮点数,算完以后再校验一次也是可以的,但又增加了时间复杂度,这不是白折腾了吗!

    仔细观察解y的后半部分7x/4,这不就是说x是4的倍数嘛,那好办了,假设x=4n,根据上面的范围可以看出n=1,2,3就3种可能。重新整理一下x、y、z关于n的方程:

    x = 4n

    y = 25-7n

    z = 75+3n

    C代码:

    void hbh()  

    {  

        intx=0,y=0,z=0;  

        for ( intn = 1; n<=3; ++n )  

        {  

            x = 4*n;  

            y = 25-7*n;  

            z = 75+3*n;  

            printf( "x=%d, y=%d, z=%d\n", x, y, z );  

        }  

    }  

    Python代码:

    for n in range(1,4):  

        x = 4*n  

        y = 25-7*n  

        z = 75+3*n  

        print( "x=%d, y=%d, z=%d " % (x,y,z) ) 

    以前有百钱买百鸡的问题,现在有的孩子都没见过铜钱,在此转述一下,也许更好理解^_^

    相关文章

      网友评论

          本文标题:1百块钱买1百颗糖果的问题

          本文链接:https://www.haomeiwen.com/subject/rjchqftx.html