我8年前漂洋过海来到海外求学,后来有一段时间和几个好朋友合租了一套房子。平时用的水、电、煤气、买菜、网络等费用,我们都是月底总结账,然后AA。我是学IT的,当时室友问我能不能写一个软件,能够快速地知道谁应该给谁多少钱。我想了不少算法,一开始想法很简单,把所有可能的情况都列出来,一点技术含量都没有。后面随着学习的深入,我找到了一种非常好的算法。
或许我上面的描述并不是非常清楚,不过没关系,接下来,在开始讲算法之前,我们先用一个场景来描述一下整个问题。场景如下:
话说,小明、豆豆、汤姆、杰瑞四个人去吃大餐,吃饭前说好,付钱的时候AA制。
但最后结账的时候,因为4个人带的钱不一样多,最后:
汤姆付了112元;
杰瑞付了86元;
小明付了10元;
豆豆没带钱,所以一分钱都没付。
过后,他们为了防止发生口角,要想办法平摊一下吃大餐的钱。少付钱的人,要把少给的钱付给多付钱的人。
现在,我们的任务就是写一个程序,帮他们提供一种可以AA的方案。最后输出:
“豆豆应付 xxx元 给 谁谁谁”
“小明应付 xxx元 给 谁谁谁”
……
很明显,有生活经验的人都知道,最后平摊的方法不只一种。但是,在实际操作中,我们只需要一种方法就行。这种方法,只要尽量简单就行。下面,我就介绍一下我的解决方案。
【补充:我最后的附件是用C语言写的。朋友们有兴趣的话,可以用其他语言实现一下。】
【第1步】
如果是手动算的话,我们首先要做的,肯定是先算出这次的总花费和平均值。然后根据平均值,就可以知道谁多付了钱,谁少付了钱。
打个比方,上面的例子中,总的花费一共是:
112