一种算法,用于找到添加到充值卡的确切金额

Posted

技术标签:

【中文标题】一种算法,用于找到添加到充值卡的确切金额【英文标题】:An algorithm to find the exact amount to add to a top-up a card 【发布时间】:2017-03-19 02:41:47 【问题描述】:

总体目标

找到充值卡的最低金额,这样卡上的余额就可以完全用完。从数学上讲,它有点类似于this。


已知

起始号码 - 卡上剩余的金额。

一组价格 - 可以从卡中扣除的一组单独的价格。

最低充值 - 您可以添加到卡中的最低金额。

最小增量 - 您只能以 25 便士的增量充值(例如,5.25 英镑而不是 5.10 英镑)


背景

我住在公寓大楼里。有一家每个人都必须使用的洗衣房,由一家名为 Circuit 的公司管理。他们有一个极其复杂的充值系统,每年从搬出去的人那里赚几千英镑,在他们的卡上留下少量的钱。我想制作一种算法,可以准确地告诉您要向卡中添加多少才能将其完全归零。

我编写的算法可以做到这一点,但仅限于一个“项目”。例如,它会告诉您添加的量足以购买 8 次低质量的洗涤液,而可以添加更少的量来购买 3 次中等质量的洗涤液和 2 次干洗液。

我或许应该补充一点,这主要是一项学术活动;为了好玩。

您可以在此处查看我在 C++ 中的暂定实现: https://github.com/SilverSkyes/F__kYouCircuit/blob/master/F__kYouCircuit/main.cpp

【问题讨论】:

这是一个算法问题,工作量很少,调试工作也很少。 @パスカル 它被标记为“算法”。它是一个算法问题有什么问题?我只是一个真正的初学者编码器,这花了我几个小时。没有任何重大错误;它运行良好。我非常努力地明确定义一个真正困难的学术问题。我会做更多的研究,但我不知道要寻找什么。我真的不明白为什么每个人都反对我:( 嗯,有很多小事加起来。它可以被视为一个数学问题,而不是一个编程问题。您链接到场外代码。您还没有尝试自己为多个项目调整代码。实际的问题是模糊的。即使经过审查,有些人也反对称为“F__kYou”的代码。问题中有很多文字,但信息不多。完全重写可以挽救这个问题,但是 6 票反对票和 2 票赞成票将很难扭转。 @m69 好吧,谢谢你至少告诉我人们不喜欢它的地方。也许我会在早上重写它好一点:) 别担心。 [C++] 标签追随者因投反对票而臭名昭著(有很多专业人士对初学者的问题感到恼火)。 【算法】标签关注者更善变;有时,无论您的问题质量如何,您都可以用一个有趣的问题对他们进行书呆子狙击。 :-) 【参考方案1】:

你描述的这个问题其实总体来说是一个非常难的问题,因为它和knapsack problem有关。但是,只有当您允许卡上的金额非常大且价格非常不同时,这才很难。

对于您在现实世界中很少有不同价格的问题,您可以通过完整枚举来解决此问题:假设您有一个固定的最高金额 c 和价格 p_1$, ..., p_n 创建深度为 n 的嵌套循环,例如这个

to_up = 0; // this will contain the number of 0.25 increases
no_p1 = 0; // this will contain the times p1 needs to be spent
...
no_pn = 0;
starting_amount = 42.0; // specify your starting amount here
WHILE (true) // to_up loop
  WHILE (true) // number of p1
     WHILE (true) // number of p2
        // ... repeat with as many different prices you have
        // now check for solution:
        IF(starting_amount - to_up * 0.25 - no_p1 * p1 - ... - no_pn * pn == 0)
        BEGIN    
           print 'found solution: ups: %1, no p1: %2, ..., no pn: %n', no_p1, ..., no_pn
           EXIT(0);
        END
        no_p2++;
     END
     no_p1++;
  END
  to_up++;
END

【讨论】:

以上是关于一种算法,用于找到添加到充值卡的确切金额的主要内容,如果未能解决你的问题,请参考以下文章

充值后的充值金额提交到账户金额中

对碰奖算法优化

微信抢红包算法实现(JAVA)

微信抢红包算法实现(JAVA)

春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。

模型和算法之间的确切区别是啥?