智力题

啤酒2元1瓶,4个瓶盖换1瓶,2个空瓶换1瓶,

问10元钱可以喝几瓶


智力题2元1瓶4个瓶盖换1瓶_#include


下面是百度知道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瓶_c语言_02


我的代码中间换啤酒的有几处数量不一样,但是结果一样,如下:


/*智力题啤酒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 ;
}