2012-03-11 29 views
1

前段時間我正在閱讀有關最小硬幣變更問題的內容,我想將其應用於假想的自動機器。Min-Coin變更 - 限量套裝的最佳解決方案

然而,一個自動機僅需要硬幣受限訪問,這將是良好的,返回到限制小型電動機,其提供每個硬幣的需要所需的硬幣的最小量。

貪心算法不能在這裏使用了我們想要的最佳解決方案,也爲機器的工作需要知道需要什麼每種類型的硬幣和多少。另一個事實是,有時機器沒有足夠的硬幣來提供所需的改變,並且一旦檢測到它就應該點亮小LED。

這是我在這裏看到計算器的問題不同,有的用醜陋的貪婪方法和別人不考慮採取實際情況,硬幣的數量有限。這更適用於真實世界問題。

如果我錯了,我會刪除的問題,只是想有可能在未來幾年真正的問題可以使用一些良好,穩定和明確的方向

這是我的第一個問題,我希望它可以幫助未來的人。

回答

0

我不知道ATM的電機限制,所以我只能看到一個問題 - 沒有足夠的硬幣所需的價值。

protected void CalculateCoins(int sum) 
    { 
     int remainder = sum; 
     int required = 0; 

     // Array of coins should be sorted by value of coins 
     CoinQnt[] normalizedCoins = new CoinQnt[] 
     { 
      new CoinQnt { Value = 50, Qnt = 1 } 
      , new CoinQnt { Value = 20, Qnt = 100 } 
      , new CoinQnt { Value = 10, Qnt = 100 } 
      , new CoinQnt { Value = 5, Qnt = 100 } 
      , new CoinQnt { Value = 2, Qnt = 100 } 
      , new CoinQnt { Value = 1, Qnt = 100 } 
     }; 

     Debug("Splitting {0}", sum); 
     // Loop through available coins 
     foreach(CoinQnt c in normalizedCoins) 
     { 
      if(remainder >= c.Value) 
      { 
       // Determine how many coins we need and how many are left 
       required = Math.Min(remainder/c.Value, c.Qnt); 
       Debug("Using {0} qnt of {1}", required, c.Value); 
       remainder -= required * c.Value; 
      } 
     } 
    } 
+0

這是一個很好的代碼示例,但它不能解決最小硬幣問題。例如,例如,如果我們必須對特定貨幣的1095進行更改,並且我們有1個1000的鈔票,20個20個和19個5個,結果將會與最佳結果不同。這個程序會給我們1000 * 1 + 4 * 20.雖然最佳的將是1000 + 19 * 5,這相當於1095. – TantoDano 2012-03-12 15:55:15

+0

是的,你是對的。可能的解決方案可能是將總和分成所有可用組合。 – 2012-03-13 07:51:48