And*_*ome 3 c# algorithm coin-change
你好,我正在尝试创建一个algorythm,找出我可以改变回来的方式.但我只是不能正确实现,我一直得到4我应该得到6,我只是不明白为什么.
这是我在C#中的实现,它是从http://www.algorithmist.com/index.php/Coin_Change的伪代码创建的.
private static int[] S = { 1, 2, 5 };
private static void Main(string[] args)
{
int amount = 7;
int ways = count2(amount, S.Length);
Console.WriteLine("Ways to make change for " + amount + " kr: " + ways.ToString());
Console.ReadLine();
}
static int count2(int n, int m)
{
int[,] table = new int[n,m];
for (int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
// Rules
// 1: table[0,0] or table[0,x] = 1
// 2: talbe[i <= -1, x] = 0
// 3: table[x, j <= -1] = 0
int total = 0;
// first sub-problem
// count(n, m-1)
if (i == 0) // rule 1
total += 1;
else if (i <= -1) // rule 2
total += 0;
else if (j - 1 <= -1)
total += 0;
else
total += table[i, j-1];
// second sub-problem
// count(n-S[m], m)
if (j - 1 <= -1) // rule 3
total += 0;
else if (i - S[j - 1] == 0) // rule 1
total += 1;
else if (i - S[j - 1] <= -1) // rule 2
total += 0;
else
total += table[i - S[j-1], j];
table[i, j] = total;
}
}
return table[n-1, m-1];
}
Run Code Online (Sandbox Code Playgroud)
出于纯粹的深夜无聊(是的,这肯定需要精炼)...它使用递归,linq并且同时产生所有并且具有与代码行一样多的括号,所以我非常满意它...
static IEnumerable<List<int>> GetChange(int target, IQueryable<int> coins)
{
var availableCoins = from c in coins where c <= target select c;
if (!availableCoins.Any())
{
yield return new List<int>();
}
else
{
foreach (var thisCoin in availableCoins)
{
foreach (var result in GetChange(target - thisCoin, from c in availableCoins where c <= thisCoin select c))
{
result.Add(thisCoin);
yield return result;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4633 次 |
| 最近记录: |