2011-04-09 11 views
0

4つの異なる請求書を使って87を得る総合的な方法を見つけるためのコードです。私はどのようにすべての単一の方法の代わりに最小額の請求書(4 - 20代、1 - 5、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に到達するために使用しなければならなかったどのように多くの法案を追跡することでしょう。次に、その配列の中で最小の番号を探すだけで、必要最低限​​の請求書になります。 –

+0

宿題?私の息子が質問するようなもののようです。 –

+0

また、合法的な2ドルの請求書があることに注意してください。 –

答えて

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を使用するつもりだったが、テストを開始したとき、私は完全に忘れてしまった。恐ろしい解決策:) –

+0

これは宿題のように見えますが、私はあなたにそれらを正確な答えを与えていないことをうれしく思っています。 – Reddog

+0

私はおそらく '残りの'に '初期'の名前を変更することをお勧めします。初期値はもはや最初の値ではないことは混乱しています。 「残っている」とするとはるかに明確になります。 –

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(); 
} 
関連する問題