【问题标题】:C# Compute dollar denominationC# 计算美元面额
【发布时间】:2011-04-09 01:48:01
【问题描述】:

这是一个代码,可以找到用 4 种不同的钞票获得 87 的总方法。我想知道如何改变它以获得最少的账单(4-20、1-5、2-1),而不是每一种方式。任何帮助将不胜感激。

int target = 87;
int[] dollarSizes = { 1, 5, 10, 20 };
int[] ways = new int[target+1];
ways[0] = 1;

for (int i = 0; i < dollarSizes.Length; i++) {
    for (int j = dollarSizes[i]; j <= target; j++) {
        ways[j] += ways[j - dollarSizes[i]];
    }
}

【问题讨论】:

  • 一种方法是跟踪您必须使用多少张钞票才能在数组中达到 87 美元。然后,您可以简单地在该数组中查找最小的数字,这将是您所需的最小账单数量。
  • 家庭作业?好像是我儿子会问的问题。
  • 另外,请注意,有一张合法的 2 美元钞票。
  • @CadeRoux 我敢肯定,这会符合要求;)就像......教授给出的那些
  • @drachenstern 在大帆船、镰刀和坚果中,一切都会变得容易得多。

标签: c# arrays algorithm


【解决方案1】:
        int target = 87;
        int[] dollarSizes = { 100, 20, 10, 5, 1 };
        int[] counts = { 0, 0, 0, 0, 0 };

        int remainder = target;
        int bill = 0;
        while (remainder > 0)
        {
            counts[bill] = remainder / dollarSizes[bill];
            remainder -= counts[bill] * dollarSizes[bill];
            bill++;
        }

【讨论】:

    【解决方案2】:

    您真正想要跟踪的是您可以多快到达目标。所以给定 20,10,5,1 面额,代码看起来是这样的 psuedo

    int initial = 87;             initial  twenties  tens   fives   ones
    int twenties = initial / 20;    87        4
    initial = initial % 20;          7        4    
    int tens = initial / 10;         7        4       0
    initial = initial % 10;          7        4       0
    int fives = initial / 5;         7        4       0       1
    initial = initial % 5;           2        4       0       1
    int ones = initial;              2        4       0       1       2
    

    如您所见,有很多重复的逻辑,因此可以从循环(我们开始最大值)提供。

    【讨论】:

    • 我本来打算用mod,但是当我开始测试时,我完全忘记了。很棒的解决方案:)
    • 看起来这看起来像是家庭作业,我很高兴你没有给他们确切的答案......
    • 我建议将 initial 重命名为 remaining。令人困惑的是,initial 最终不再是初始值。 remaining 让它更清晰。
    • @Reddog 我认为给他循环太多了。我真正做的只是使用孩子应该知道的相同逻辑;)
    • @drachenstein:相当糟糕:87 % 207,而不是 4
    【解决方案3】:

    先用最高的钞票数数。如果新金额太大,请不要添加该账单,并继续使用下一个美元大小:

    class Program
    {
        static void Main(string[] args)
        {
            var target = 87;
            var current = 0;
            var dollarSizes = new[] { 1, 5, 10, 20 }.OrderByDescending(x => x); // just make sure they're descending.
            var bestWay = new List<int>();
    
            foreach (var dollarSize in dollarSizes)
            {
                while (current + dollarSize <= target)
                {
                    current += dollarSize;
                    bestWay.Add(dollarSize);
                }
    
                if (current == target)
                    break;
            }
    
            foreach (var dollar in bestWay)
            {
                Console.Write("{0}, ", dollar);
            }
    
            Console.ReadLine();
        }
    }
    

    【讨论】:

      【解决方案4】:
      public static int MakeChange(int amount)
      {
          if (amount < 0)
              throw new ArgumentOutOfRangeException("Amount should be greater than 0.");
      
          int[] availableBills = { 20, 10, 5, 1 };
          int[] availableBillCounts = { 0, 0, 0, 0 };
          int iterator = 0;
          int reminder = amount;
      
          while (reminder > 0)
          {
              availableBillCounts[iterator] = reminder / availableBills[iterator];
              reminder = amount % availableBills[iterator];
              iterator++;
          }
      
          return availableBillCounts.Sum();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 2017-01-18
        • 1970-01-01
        相关资源
        最近更新 更多