智力题
啤酒2元1瓶,4个瓶盖换1瓶,2个空瓶换1瓶,
问10元钱可以喝几瓶
下面是百度知道txt998 的回答:
1.10元买5瓶啤酒,喝完后,有5个空瓶和5个盖;
2.4个空瓶换2瓶啤酒,4盖换1瓶啤酒,剩下1个空瓶和1个盖,喝完后,有4个空瓶和4个盖;
3.4个空瓶换2瓶啤酒,4盖换1瓶啤酒,喝完后,有3个空瓶和3个盖;
4.2个空瓶换1瓶啤酒,喝完后,有2个空瓶和4个盖;
5.2个空瓶换1瓶啤酒,4盖换1瓶啤酒,喝完后,有2个空瓶和2个盖;
6.2个空瓶换1瓶啤酒,喝完后,有1个空瓶和3个盖;
7.借1瓶啤酒,喝完后,有2个空瓶和4个盖;换2瓶啤酒,还1瓶,还剩1瓶
8.借1瓶啤酒,2瓶喝完后,有2个空瓶和2个盖;换1瓶啤酒还上,还剩2个盖;
9.借2瓶啤酒,喝完后,有2个空瓶和4个盖;换2瓶啤酒还上,不再剩下瓶和盖。
所以共有:5+3+3+1+2+2+1+1+2=20
重庆空调维修04 | 2016-12-25 09:55
拉吉,算的这么复杂,瓶盖值5毛,瓶子值1元,啤酒就只值五毛,10元直接和20瓶了
分析图:
我的代码中间换啤酒的有几处数量不一样,但是结果一样,如下:
/*智力题啤酒2元1瓶,4个瓶盖换1瓶,2个空瓶换1瓶,问10元钱可以喝几瓶*/
#include<stdio.h>
int ping, P, G;//整瓶,瓶子,瓶盖
int sum = 10, price = 2;
int ans = 0;
void jiejiu(int ping, int G, int P);
void main()
{
ping = sum / price;
ans += ping;
G = ping;
P = ping;
ping = 0;//被分解出瓶子和瓶盖了
for (; G >= 4 || P >= 2;)
{
ping = G / 4 + P / 2;
ans += ping;
G = G % 4 + ping;//每个整瓶有一个瓶盖和一个瓶子
P = P % 2 + ping;
ping = 0;//分解后
//printf("%d\n", ans);
}
//吃干榨净,借酒!!
jiejiu(ping, G, P);
printf("%d\n",ans);
}
void jiejiu(int ping, int G, int P)
{
if (G == 2 && P == 0) { ans += 2; return; }//再无别的可能,借2瓶还2瓶再无瓶盖瓶子
if (G == 3 || P == 1)//任意一种都有能力借一瓶还一瓶
{
ping = ping + 1;//借1整瓶
ans += ping;//喝酒取瓶,喝完才能分解
G = G + ping;
P = P + ping;
ping = G / 4 + P / 2;//兑换
ping = ping - 1;//还1整瓶
ans += ping;//结算还后的喝到的瓶中啤酒
G = G % 4 + ping;
P = P % 2 + ping;
ping = 0;//分解后
//printf("%d\n", ans);
jiejiu(ping, G, P);
}
return ;
}