C#:货币渲染解决方案

时间:2017-06-09 03:20:33

标签: c# .net algorithm

我必须为此任务找到解决方案:

"超市越来越多地配备自动收款机。这些基金中的大多数只接受信用卡付款,但很大一部分消费者仍然支付现金(纸币和硬币)。

现金支付遇到的一个问题是提供资金:如何以最佳方式提供给定金额,即使用最少数量的硬币和纸币?这对我们每个人来说都是一个问题,更不用说自动收款机了。

在本练习中,我要求尝试找到一个最佳解决方案,以便在特定情况下进行更改:当自动收银机仅包含2欧元硬币,5欧元和10欧元纸币时。

为了简化问题,我们会考虑所有这些硬币和账单都是无限量的。

以下是货币的一些示例: enter image description here

货币的回报由Currency对象表示。此商品有3项属性:piece2,billet5和billet10,分别存储2€,5€门票和10€门票的硬币数量。

例如,如果我们采用表格的示例2(6€),我们应该得到一个Money对象:

  • Piece2价值3(3件2€)
  • Ticket5值0(没有5欧元的票)
  • Ticket10值0(无票10欧元)

任务:实现 MonnaieOptimale(int s)方法,该方法返回一个Currency对象,其中包含总和为 s 的硬币和注释。如果无法返回货币(如示例1所示),则返回null。

为了达到最佳效果,解决方案将始终在必要时进行更改并使用最少数量的硬币和门票。"

数据: s 始终是严格正整数(long)小于或等于9223372036854775807

解决方案的一般结构如下:enter image description here

建议??

3 个答案:

答案 0 :(得分:0)

首先,简单的贪婪方法(总是得到最大的,即10)在这里不起作用,因为系统不是规范的,考虑s = 11,你会得到"不可能"如果您使用硬币10,但可以使用{5,2,2,2}。

我在这里略有不同,使用奇数/偶数的奇偶校验:

  1. 如果s是偶数,那就做贪婪的做法,但绝不使用硬币5
  2. 如果s是奇数,请继续使用硬币5直到s变为偶数,然后执行步骤1.
  3. 例如: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