矿泉水,空瓶,瓶盖,再兑换矿泉水类问题"/>
买矿泉水,空瓶,瓶盖,再兑换矿泉水类问题
听到这个,是否有些感触?是否见过这一类的题目?
实际上这种题,并不困难......
看个例题叭:
你有十块钱,矿泉水两块钱一瓶,四个瓶盖换一瓶,两个空瓶换一瓶,你能买多少瓶矿泉水?
没错,短短几句话,实则一道深奥的数学题
这道题有许多解法,“通往罗马的路不止一条”
方程实现:
我们可以通过数学方程来解决这道题:
设使用空瓶兑换到的瓶数为X(整数)
设使用空瓶兑换到的瓶数为Y(整数)
则总瓶数为5+X+Y
可列出二元一次不等式组:
1、 设Y=1,由公式2求出则X={0,1},将X,Y带入公式1,不符合(舍去)
2、 设Y=2,由公式2求出则X={1,2,3,4},将X,Y带入公式1,不符合(舍去)
3、 设Y=3,由公式2求出则X={4,5,6,7},将X,Y带入公式1,求解X=7
所以一共喝了5+X+Y=5+3+7=15(瓶)
看,解决了!!!
但是......若是给你很多钱,或者直接给你原来有好多瓶,例如1000元,100000瓶,这再去列二元一次不等式组显然不太行得通......
所以,这就要用到更高级的算法,运用到C++代码操作
代码实现:
我们可以通过代码来实现计算:
为了程序更灵活,我们可以读入任意金额:
int a; //定义
cin>>a; //输入有几元钱
int b=a/2; //空瓶的数量
int c=b; //瓶盖的数量
int sum=b; //记录总共喝了几瓶
表示花光这些钱,可以得到a/2个空瓶,也就有a/2个瓶盖,喝了a/2瓶水,所有的量定义完了之后,我们就要想下面部分了
每次都有可能再兑换到水,这将会直接影响空瓶的数量以及瓶盖都数量
所以,这就要用到while循环
看看题目:四个瓶盖换一瓶,两个空瓶换一瓶
所以,只要b>=2或者c>=4,就会衍生出许多情况,故循环条件就是b>=2或者c>=4,然后再继续循环查看
while(b>=2||c>=4) //只要空瓶>=2或者瓶盖>=4,就可以再换,继续查看情况
继续查看,如果瓶盖大于4个,就会消耗4个瓶盖,再获得一瓶矿泉水,因此产生一个空瓶和一个瓶盖;如果空瓶大于2个,就会消耗2个空瓶,再获得一瓶矿泉水,因此产生一个空瓶和一个瓶盖
if(b>=2) //如果空瓶>=2
{b-=2; //换走两个空瓶sum++; //可以再喝一瓶c+=1; //换来一瓶得到一个瓶盖b+=1; //换来一瓶得到一个空瓶
}
if(c>=4) //如果瓶盖>=2
{c-=4; //换走四个瓶盖sum++; //可以再喝一瓶b+=1; //换来一瓶得到一个空瓶c+=1; //换来一瓶得到一个瓶盖
}
只要走到最后b>=2或者c>=4,意思就是还能换,就会再走一遍,直到两个条件都不成立,不能再换为止
最后只要输出sum,喝了几瓶就行啦
cout<<sum;
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{int a; //定义 cin>>a; //输入有几元钱 int b=a/2; //空瓶数量int c=b; //瓶盖数量int sum=b; //记录总共喝了几瓶while(b>=2||c>=4) //只要空瓶>=2或者瓶盖>=4,就可以再换 {if(b>=2) //如果空瓶>=2{b-=2; //换走两个空瓶sum++; //可以再喝一瓶c+=1; //换来一瓶得到一个瓶盖b+=1; //换来一瓶得到一个空瓶}if(c>=4) //如果瓶盖>=2{c-=4; //换走四个瓶盖sum++; //可以再喝一瓶b+=1; //换来一瓶得到一个空瓶c+=1; //换来一瓶得到一个瓶盖}}cout<<sum; //输出一共喝了几瓶return 0;
}
运行效果:
这样,这道例题就解决啦(若是直接给的瓶子数量,稍作修改即可,这里就不再赘述)
(当然,这是不存在“借”这个行为,否则另外讨论计算)
简便算法实现:
运用递推迭代算法:
喝的总瓶数m=4*初次瓶数k-5
这里的k再这道题就是b(a/2),即是买光钱所得到的瓶数
这么一看,是不是就特别easy?
至此,这一类问题你已经会做了,还有更多更巧妙的算法,就不再一一说明了
总结:
这是一道相对简单,贴近生活的一道数学逻辑题,运用方程,代码,算法.....都可以实现解答
补充:
其中有一个规律,即最后总会剩下3个瓶盖,1个空瓶
更多推荐
买矿泉水,空瓶,瓶盖,再兑换矿泉水类问题
发布评论