2011-04-09 67 views
0

下面是一個代碼,用於查找使用4個不同賬單獲取87的總方法。我想知道如何改變這種方式,以獲得最少數量的賬單(4年,1年,1年,2年)而不是每一種方式。任何幫助,將不勝感激。C#計算美元面值

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]]; 
    } 
} 
+0

一種方式將跟蹤你有多少票據使用數組來達到$ 87然後,您可以簡單地查找該數組中的最小數字,這將是您所需的最小數量的賬單。 – 2011-04-09 01:53:18

+0

作業?似乎我的兒子會有一些問題。 – 2011-04-09 01:59:55

+0

另外,請注意,有一個合法的2美元賬單。 – 2011-04-09 02:11:57

回答

2
 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++; 
     } 
0

使用最高法案優先數。如果新的量太大,不添加該法案,並移動到下一個美元尺寸:

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(); 
    } 
} 
2

真的是你要跟蹤的是你能多快到達目標。因此,考慮20,10,5,1面額,代碼看起來像這樣的僞

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 

正如你可以看到,有很多重複的邏輯,這樣就可以從一個循環(我們開始喂最大值)。

+0

我打算使用mod,但是當我開始測試時,我完全忘了。真棒解決方案:) – 2011-04-09 02:06:17

+0

看來好像這看起來像家庭作業,我很高興你沒有給他們確切的答案... – Reddog 2011-04-09 02:06:25

+0

我會建議重命名'初始'也許'剩下'。令人困惑的是,最初的初始值不再是最初的值。 「剩餘」使得它更清晰。 – 2011-04-09 02:23:26

0
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(); 
}