A地有100个梨,猴子要把这100个梨搬到B地,A,B地之间的距离是50步,猴子一次只能搬50个梨,猴子每前进或后退一步都得吃一个梨,问到达B地最多剩多少个梨?最少需要几步?
根据题意“A,B地之间的距离是50步,猴子一次只能搬50个梨。”所以猴子不可能直接这么从A地搬到B地,而是一定会中途返回,先把剩余的梨子放到某点,然后回到A地把剩余的梨子搬完,接着,当走到之前放置地点时,把之前剩余的梨子一起搬上,最后走到B地(往返的次数越少,则相对的得到的梨也越多,走的步数也越少),这里假设的是一次往返就能够搬完全部的梨子。
假设第一次走到M步的时候返回:
50(猴子一次能够搬梨的总数)
猴子吃掉的梨子数:n=M
此时剩余的梨子数:50-n
然而返回一趟后,剩余的梨子数:50-n-n
--猴子返回时,身上带着的是返回到A地时所要吃掉的梨子数(M),剩余的梨子(50-n-n)则留在了M地。
第二次从A地走到M步的时候:
50(猴子一次能够搬梨的总数,此时也就是剩余的那50个梨子)
猴子吃掉的梨子数:n=M
剩余的梨子数:50-n
剩余的总梨子数:
第一次到M步时剩余的梨子数+第二次到M步时剩余的梨子数-走完剩余(50-M)步时所要吃掉的梨子数
(50-n-n )+(50-n)-(50-n)=50-2*n
所走的总步数:
第一次走的M步+第一次返回时走的M步+第二次走的M步+走完剩余(50-M)步
n + n + n + (50-n)=50+2*n
M的范围:
1 M最大值(M=n)
根据上面推出的剩余的总梨子数(50-2*n),即没有剩余(梨子数为零)时M为最大值。
M=n=25
由于25无实际意义,故值为24。(可以求出最少剩多少个梨?最多需要几步?)
2 M最小值(M=n)
猴子第一次返回到A地时剩余的梨子数+猴子第二次走到M步时剩余的梨子数<=50(猴子一次只能搬的梨子数)
(50-n-n)+ (50-n)<=50
(M=n)>=16.6
M为整数,故>=17。 (可以求出最多剩多少个梨?最少需要几步?)
算法代码:(主要说明一下)
1 int n = 0;
2
3 for (int i = 17; i < 25; i++) {
4
5 n = i;
6
7 System.out.println(i + " " + (50 - 2 * n) + " " + (50 + 2 * n));
8
9 }