龙空技术网

VBA学习笔记:算法:空瓶盖子换酒问题

简单学学EXCEL 213

前言:

今天咱们对“n人分酒问题算法”大概比较讲究,各位老铁们都想要剖析一些“n人分酒问题算法”的相关内容。那么小编同时在网摘上网罗了一些关于“n人分酒问题算法””的相关内容,希望各位老铁们能喜欢,大家快快来了解一下吧!

昨日给孩子辅导作业,看到这题:汽水2元一瓶,每2个空瓶可以换一瓶汽水,每4个瓶盖可以换一瓶汽水;问10元钱最多可以喝到多少瓶汽水?不知道怎么解,查了下解法,就想着用程序代码试试。

汽水 = Int(钱 / 价) //VBA 可以用 中文 当变量

空瓶 = Int(钱 / 价) 盖 = Int(钱 / 价) 等同于写法:盖 = 钱 \ 价

钱 = 钱 Mod 价 //计算余下的钱,有需要的情况下用

//注:VBA里自带MOD函数,不可写作WorksheetFunction.Mod调用工作表函数

先把钱都买成汽水,下面将循环兑换“空瓶”与“盖子”

// WorksheetFunction.Quotient(钱, 价),Quotient是工作表中的求商函数,下面用到。

Do

汽水 = 汽水 + WorksheetFunction.Quotient(空瓶, m - 1)

盖 = 盖 + WorksheetFunction.Quotient(空瓶, m - 1)

空瓶 = 空瓶 Mod (m - 1)

//上述语句 把“空瓶”一次性都兑换掉,空瓶兑换比例实际是m-1:1,因为每兑换一次又会得到一个空瓶,实际上兑换花掉的空瓶只是m-1。

汽水 = 汽水 + WorksheetFunction.Quotient(盖, n - 1)

空瓶 = 空瓶 + WorksheetFunction.Quotient(盖, n - 1)

盖 = 盖 Mod (n - 1)

//上述语句 把“盖子”一次性都兑换掉,盖子兑换比例也是n-1:1

Loop Until 空瓶 < (m - 1) And 盖 < (n - 1)

得到的结果如上图,与正确的结果有出入(正确结果为20,找老板借2整瓶,还给老板2个空瓶与4个盖子,正好平衡)。循环算法似乎只能到这一步,没想出好的算法。如果可以借,循环就能产生负数,循环停止的条件不好判定。请大神指点。

我的解决之道:在循环之后向”老板借“,进行配瓶或配盖。比如再借2瓶,就得到两个空瓶、4个盖子;将借的2瓶用“空瓶”和“盖”还了之后,判断”债务“是否还清,还清就表示可以“借”;且 汽水= 汽水+借的数。

Do While 空瓶 >= 0 And 盖 > 0

借 = m - 空瓶 //借的数量:差几个空瓶可以兑换1整瓶,就借几瓶。

盖 = 盖 + 借

t = Int(盖 / n) - (借 - 1) // t值,计算能否还清。空瓶正好兑1,盖子兑换数能否抵(借 - 1)

If t >= 0 Then

汽水 = 汽水 + 借

空瓶 = 0

盖 = 盖 Mod n

Else: Exit Do

End If

Loop

其实 Do while循环可以换做 If,因为这个“借还法”实际上最多就能产生一次;第二次肯定是”还“不上的。

附:此题引申后,我发现网上有些解法是有误的。如下图:用”价值法“或列方程解下图中的题,解都是 75。与程序得出的74有1瓶之差。产生原因:借1瓶得3空瓶,3瓶盖;3空瓶兑半瓶,3瓶盖兑半瓶正好一瓶,但这兑半瓶我觉得不符合题目逻辑。

标签: #n人分酒问题算法