我必须为此任务找到解决方案:
"超市越来越多地配备自动收款机。这些基金中的大多数只接受信用卡付款,但很大一部分消费者仍然支付现金(纸币和硬币)。
现金支付遇到的一个问题是提供资金:如何以最佳方式提供给定金额,即使用最少数量的硬币和纸币?这对我们每个人来说都是一个问题,更不用说自动收款机了。
在本练习中,我要求尝试找到一个最佳解决方案,以便在特定情况下进行更改:当自动收银机仅包含2欧元硬币,5欧元和10欧元纸币时。
为了简化问题,我们会考虑所有这些硬币和账单都是无限量的。
货币的回报由Currency对象表示。此商品有3项属性:piece2,billet5和billet10,分别存储2€,5€门票和10€门票的硬币数量。
例如,如果我们采用表格的示例2(6€),我们应该得到一个Money对象:
任务:实现 MonnaieOptimale(int s)方法,该方法返回一个Currency对象,其中包含总和为 s 的硬币和注释。如果无法返回货币(如示例1所示),则返回null。
为了达到最佳效果,解决方案将始终在必要时进行更改并使用最少数量的硬币和门票。"
数据: s 始终是严格正整数(long)小于或等于9223372036854775807
建议??
答案 0 :(得分:0)
首先,简单的贪婪方法(总是得到最大的,即10)在这里不起作用,因为系统不是规范的,考虑s = 11
,你会得到"不可能"如果您使用硬币10,但可以使用{5,2,2,2}。
我在这里略有不同,使用奇数/偶数的奇偶校验:
s
是偶数,那就做贪婪的做法,但绝不使用硬币5 s
是奇数,请继续使用硬币5直到s
变为偶数,然后执行步骤1. 例如:s
= 18,解= {10,2,2,2,2}。 s
= 23,解决方案= {5,10,2,2,2,2}
为什么它起作用,是因为人们可以注意到,对于硬币系统{2,10},你可以使用贪婪方法制作任何偶数s
(它对于偶数域是规范的)。
另外,对于任何奇数减去另一个奇数将产生偶数,因此对于奇数s
,我们可以使用一个硬币5来s
甚至减少问题。
从这个逻辑来看,我认为任何s
最多只能使用一个5硬币,只有当s = 1 or 3
答案是"不可能"
答案 1 :(得分:0)
public static Monnaie MonnaieOptimale(long s)
{
if (s<10)
{
if (s%2 =0) {Monnaie.billet10 = 0 ; Monnaie.billet5 = 0 ; Monnaie.piece2 = s/2 }
else if (s == 5) {Monnaie.billet10 = 0 ; Monnaie.billet5 = 1 ; Monnaie.piece2=0 }
else if (s == 7) {Monnaie.billet10 = 0 ; Monnaie.billet5 = 1 ; Monnaie.piece2=1 }
else Monnaie.billet10 = 0 ; Monnaie.billet5 = 1 ; Monnaie.piece2= 2
}
else
{
if (s%2 =0)
{
Monnaie.billet10 = Math.Floor(s/10);
if ((Monnaie.billet10 * 10) != s) {Monnaie.billet5 = 0 ; Monnaie.piece2= (s%10)/2 }
}
else
{
private lastDigit = s%10;
if (lastDigit ==1){Monnaie.billet10 = ((s/10)-1) ; Monnaie.billet5 = 0 ; Monnaie.piece2=3 }
else if (lastDigit ==3){Monnaie.billet10 = ((s/10)-1) ; Monnaie.billet5 = 0 ; Monnaie.piece2=4 }
else if (lastDigit ==5){Monnaie.billet10 = (s/10) ; Monnaie.billet5 = 1 ; Monnaie.piece2=0 }
else if (lastDigit ==7){Monnaie.billet10 = (s/10) ; Monnaie.billet5 = 1 ; Monnaie.piece2=1}
else {Monnaie.billet10 = (s/10) ; Monnaie.billet5 = 1 ; Monnaie.piece2=2}
}
}
}
答案 2 :(得分:0)
using System;
public class Program {
public static void Main() {
int re10 = 0, re5 = 0, re2 = 0, s = 197;
while (s / 2 != 0) {
while (s / 5 != 0) {
while (s / 10 != 0) {
if (s % 10 % 5 == 0) {
re10 = s / 10;
s = s % 10;
}
else {
if (s / 10 > 1) {
re10 = s / 10 - 1;
s = s % 10 + 10;
}
break;
}
}
if (s % 5 % 2 == 0) {
re5 = s / 5;
s = s % 5;
} else
if (s / 5 > 1) {
re5 = s / 5 - 1;
s = s % 5 + 5;
}
break;
}
re2 = s / 2;
s = s % 2;
}
if(re5==3){re10+=1;re5-=2;}
Console.WriteLine("billet 10 :" + re10);
Console.WriteLine("billet 5 :" + re5);
Console.WriteLine("billet 2 :" + re2);
Console.WriteLine("Total : "re2 * 2 + re10 * 10 + re5 * 5);
}
}
billet 10 :18
billet 5 :3
billet 2 :1
Total : 197