一种算法,用于找到添加到充值卡的确切金额
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
【讨论】:
以上是关于一种算法,用于找到添加到充值卡的确切金额的主要内容,如果未能解决你的问题,请参考以下文章
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。