问题很简单:有10元钱,一瓶啤酒2元,4个瓶盖可换一瓶酒,2个酒瓶可换一瓶酒,求共可换多少瓶酒?
1. 基本分析
  将问题化为初始值以及条件判断问题。
  初始值为:5瓶啤酒、5个啤酒瓶、5个啤酒盖
  条件判断:兑换后剩余的啤酒瓶或啤酒盖不能够满足兑换条件
  故依次编写Matlab程序,如下所示。

%% 问题内容
%有10元钱,一瓶啤酒2元,4个瓶盖可换一瓶酒,2个酒瓶可换一瓶酒,求共可换多少瓶酒?
%% 计算流程
Money=10;
Money_Per_Beer=2;
Num_Per_Beer_Bottles=2;
Num_Per_Beer_Caps=4;
Beers=floor(Money/Money_Per_Beer);
Beer_Bottles=Beers;
Beer_Caps=Beers;
while Beer_Bottles>=Num_Per_Beer_Bottles || Beer_Caps>=Num_Per_Beer_Caps
    Add_Beers_By_Beer_Bottles=floor(Beer_Bottles/Num_Per_Beer_Bottles);
    Left_Beer_Bottles=mod(Beer_Bottles,Num_Per_Beer_Bottles);
    Add_Beers_By_Beer_Caps=floor(Beer_Caps/Num_Per_Beer_Caps);
    Left_Beer_Caps=mod(Beer_Caps,Num_Per_Beer_Caps);
    Add_Beers=Add_Beers_By_Beer_Bottles+Add_Beers_By_Beer_Caps;
    Beers=Beers+Add_Beers;
    Beer_Bottles=Left_Beer_Bottles+Add_Beers;
    Beer_Caps=Left_Beer_Caps+Add_Beers;
end
%% 显示结果
disp (['最终获得' ,num2str(Beers),'瓶啤酒!']);
disp (['最终剩下' ,num2str(Beer_Bottles),'个啤酒瓶!']);
disp (['最终剩下' ,num2str(Beer_Caps),'个啤酒盖!']);

2. 深层推断
  逆向思维,假设钱数无限多,那么就有无限多的瓶盖和瓶子,近乎可以认为瓶子和瓶盖总能够兑换为啤酒。按照“4个瓶盖可换一瓶酒,2个酒瓶可换一瓶酒”的逻辑,那么一个瓶盖值0.5元,一个酒瓶值1.0元,那么一瓶酒的价值为(2-1-0.5)=0.5元,那么可以认为,在钱足够多(其实在10元以上就差不多满足条件了)的时候,一瓶酒大约只需0.5元钱,这其实与计算结果是一致的。

Beer Number

标签: none

评论已关闭