Came across this one today, while studying https://www.coursera.org/course/bioinformatics
DPCHANGE(money, coins)
MinNumCoins(0) ? 0
for m ? 1 to money
MinNumCoins(m) ? 8
for i ? 1 to |coins|
if m = coini
if MinNumCoins(m - coini) + 1 < MinNumCoins(m)
MinNumCoins(m) ? MinNumCoins(m - coini) + 1
output MinNumCoins(money)
Takes a comma-separated string of denominations available, and the target amount.
C# implementation:
public static void DPCHANGE(int val, string denoms)
{
int[] idenoms = Array.ConvertAll(denoms.Split(','), int.Parse);
Array.Sort(idenoms);
int[] minNumCoins = new int[val + 1];
minNumCoins[0] = 0;
for (int m = 1; m <= val; m++)
{
minNumCoins[m] = Int32.MaxValue - 1;
for (int i = 1; i <= idenoms.Count() - 1; i++)
{
if (m >= idenoms[i])
{
if (minNumCoins[m - idenoms[i]] + 1 < minNumCoins[m])
{
minNumCoins[m] = minNumCoins[m - idenoms[i]] + 1;
}
}
}
}
}