《爱情公寓5》中有个剧情:每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒?
脑海模拟起来的确有点费劲。心算结果是15瓶,而剧情实践竟然是20瓶!结合弹幕说的酒吧可能能够借酒,故猜想借酒使最终喝了20瓶。
若是改变拥有的钱数或啤酒价格时,答案又是什么呢?
此时,不由想用编程的方法解决一下。编程
分两种状况:酒吧能够借酒;酒吧不能够借酒;swift
此时,当剩余酒盖数<4且剩余空瓶数<2时,计算就结束了code
这种状况比较麻烦,须要考虑1个空瓶和3个瓶盖时借一瓶酒的状况。此时,当换完酒、假设喝了酒并把酒瓶换新酒、喝了新酒以后(空瓶1,瓶盖3),手上的酒瓶和酒盖的价值不大于已借的酒瓶数(2瓶)时,就须要考虑结束计算了。
详细代码以下:get
// // main.swift // beerMaxDrink // // Created on 2020/2/4. // Copyright © 2020. All rights reserved. // /* 酒吧啤酒2元一瓶,两个空瓶或四个瓶盖能够换一瓶啤酒(酒吧概不借酒),你有10元钱,请问最多能够喝几瓶? */ import Foundation //共累计喝的瓶数 var drinkSum = 0 //当前瓶子数 var bottleNum = 0 //当前瓶盖数 var capsNum = 0 //返回(累计喝瓶数,剩余瓶子数,剩余瓶盖数) func getMaxDrinkSum(money:Float, price:Float) ->(Int, Int, Int) { bottleNum = Int(money / price) capsNum = bottleNum drinkSum = bottleNum //开始换酒,是个循环 while bottleNum > 1 || capsNum > 3 { //酒瓶换 let wineAddedByBottle = bottleNum / 2 drinkSum += wineAddedByBottle bottleNum = bottleNum % 2 + wineAddedByBottle capsNum += wineAddedByBottle //酒盖换 let wineAddedByCaps = capsNum / 4 drinkSum += wineAddedByCaps capsNum = capsNum % 4 + wineAddedByCaps bottleNum += wineAddedByCaps } return (drinkSum, bottleNum, capsNum) } //能够借酒时,返回(累计喝瓶数,剩余瓶子数,剩余瓶盖数) func getMaxDrinkSumCanBorrow(money:Float, price:Float) ->(Int, Int, Int) { var borrowedNum = 0 bottleNum = Int(money / price) capsNum = bottleNum drinkSum = bottleNum //开始换酒,是个循环 while bottleNum >= 1 || capsNum >= 3 { //酒瓶换 let wineAddedByBottle = bottleNum / 2 drinkSum += wineAddedByBottle bottleNum = bottleNum % 2 + wineAddedByBottle capsNum += wineAddedByBottle //若是(2酒瓶2酒盖时,"酒瓶换"已经把2酒瓶换为1瓶1盖,即变为1瓶3盖,方便作判断)借一瓶后,空瓶和瓶盖能换的酒数 <= 已借瓶数时,结束;不然,借一瓶 if 1 == bottleNum || 3 == capsNum{//不能少,不然在循环时会提早借酒 if (bottleNum + 1)/2 + (capsNum + 1)/4 <= borrowedNum { //不该该喝一瓶,回退 bottleNum += 1 capsNum -= 1 return (drinkSum - 1, bottleNum - borrowedNum, capsNum - borrowedNum) }else{ //借一瓶 borrowedNum += 1 bottleNum += 1 capsNum += 1 //酒瓶换 let wineAddedByBottle = bottleNum / 2 drinkSum += wineAddedByBottle bottleNum = bottleNum % 2 + wineAddedByBottle capsNum += wineAddedByBottle } } //酒盖换 let wineAddedByCaps = capsNum / 4 drinkSum += wineAddedByCaps capsNum = capsNum % 4 + wineAddedByCaps bottleNum += wineAddedByCaps } return (drinkSum, bottleNum, capsNum) } let rslt0 = getMaxDrinkSum(money: 10.0, price: 2) print(rslt0) let rsltCanBorrow0 = getMaxDrinkSumCanBorrow(money: 10.0, price: 2) print(rsltCanBorrow0) let rslt1 = getMaxDrinkSum(money: 10.0, price: 5) print(rslt1) let rsltCanBorrow1 = getMaxDrinkSumCanBorrow(money: 10.0, price: 5) print(rsltCanBorrow1)
运行结果以下,证实代码正确:it
(15, 1, 3) (20, 0, 0) (3, 1, 3) (8, 0, 0) Program ended with exit code: 0