2017-07-19 82 views
0

我想获得使用四个基本面额(1,5,10,25)来确定某个价格的所有可能方法。我有以下代码。我知道它会在一个集合中生成结果,但我不知道如何在运行时提取整数。有人可以帮忙吗?无法将类型System.Collections.Generic.Icollection <int>转换为int

void CoinCalculator() 
{ 
    //function that checks how many coins and of what denomation the player needs 

    //get a copy of the purse contents 
    priceChecker = ApplicationManager.am_keyPrice; //hold key Price 


    List<ICollection<int>> coins = new List<ICollection<int>>(); 


    coins.Add(CoinChange1.GetCoinSets(priceChecker)[0]); 


} 

public class CoinChange1 
{ 
    private int[] cs = new [] {25, 10, 5, 1}; 

    private List<ICollection<int>> solutions = new List<ICollection<int>>(); 

    public static IList<ICollection<int>> GetCoinSets(int total) { 
     // Handle corner case outside of recursive solution 
     if (total == 0) 
      return new List<ICollection<int>>(); 

     // Get all possible sets 
     CoinChange1 cc = new CoinChange1(); 
     cc.GetCoinSets (total, 0, new Stack<int>()); 
     return cc.solutions; 
    } 

    private void GetCoinSets(int n, int csi, Stack<int> combo) { 
     // Find largest allowable coin (exploiting that cs is ordered descendingly) 
     while (cs[csi] > n) 
      csi++; 
     int c = cs [csi]; 

     combo.Push (c); // Track coin selection 
     if (n == c) 
      solutions.Add(combo.ToArray()); // Base case 
     else 
      GetCoinSets (n - c, csi, combo); // Recursion 1: with a selected coin 
     combo.Pop(); 

     // Recurse for all other possibilities beyond this point with a combo of smaller coin units 
     if(csi < (cs.Length - 1)) 
      GetCoinSets (n, csi + 1, combo); 
    } 
} 
+0

很简单,因为它吸收不使用ICollection的。 – Will

回答

0

你有收藏列表,以便将它们输出到控制台,例如:

foreach(ICollection<int> coll in solutions)(
{ 
    foreach(int item in coll) 
    { 
      Console.WriteLine(item); 
    } 
} 

因为你ALIST收藏你必须遍历列表,列表中的每个项目迭代收集到你的int。

+0

非常感谢!真的很感激它。 – rpthomps

0

您可以迭代结果并“打印”它们或做任何你想做的事情。例如。如果输入

 var result = GetCoinSets(priceChecker);    
     // display result 
     for (int i = 0; i < result.Count; i++) { 
      string valuesSeparatedByComma = string.Join(", ", result[i]); 

      Debug.WriteLine($"Combinaison #{i + 1}: {valuesSeparatedByComma}"); 
     } 

将显示:

Combinaison #1: 5, 10 
Combinaison #2: 1, 1, 1, 1, 1, 10 
Combinaison #3: 5, 5, 5 
Combinaison #4: 1, 1, 1, 1, 1, 5, 5 
Combinaison #5: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5 
Combinaison #6: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 
+0

感谢您的快速回复!我添加了以下行传递给一个数组,它的工作... int [] coins = CoinChange1.GetCoinSets(priceChecker)[0] .ToArray (); – rpthomps

+0

将一个列表投射到int(int [])的数组是非常有用的,它们都可以以相同的方式迭代。 – Zyo

相关问题