1百块钱买1百颗糖果的问题
高级糖果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) )
以前有百钱买百鸡的问题,现在有的孩子都没见过铜钱,在此转述一下,也许更好理解^_^