硬币找零问题:要找开money元钱,需要的最小硬币数
question: 硬币面额:CoinValues[], coinNum, 需要找零钱:money
output: 从1 -- money对应需要的硬币数目coinsUsed[]
动态规划思想:
coinsUsed[0] = 0;
coinsUsed[i] = Min { coinsUsed[i-CoinValues[j]] +1 } [j: 1 to coinNum],if i >= CoinValues[j]
//保存要找开 i 元钱,需要的最小硬币数量
例如:硬币:2, 5, 6, 8, 1 找钱money:10
i = 1时,对j从1 to coinNum遍历,if i>=CoinValues[j],则求Min{coinsUsed[i-CoinValues[j]] +1}
即coinsUsed[1] = coinsUsed[i-CoinValues[4]] + 1 = coinsUsed[0] + 1 = 1
i = 2时,coinsUsed[2] = Min {coinsUsed[2-CoinValues[0]]+1, coinsUsed[2-CoinValues[4]]+1}
= Min {coinsUsed[0]+1, coinsUsed[1]+1} = 1
...
i = 8时,coinsUsed[8] = Min {coinsUsed[8-CoinValues[j]]+1} [j From 0 To coinNum(4)] = 1
int main()
{
int coinValue[] = {2, 5, 6, 8, 1};
int coinNum = sizeof(coinValue)/sizeof(int);
int money = 20;
int coinsUsed[money];
makeChange(coinValue, coinNum, money, coinsUsed);
return 0;
}
void makeChange(int coinValues[], int coinNum, int money, int coinsUsed[])
{
coinsUsed[0] = 0;
for (int cents = 1; cents <= money; cents ++)
{
int minCoins = INF;
for (int kind = 0; kind < coinNum; kind ++)
{
if (coinValues[kind] <= cents)
{
int temp = coinsUsed[cents - coinValues[kind]] + 1;
if (temp < minCoins)
{
minCoins = temp;
}
}
}
coinsUsed[cents] = minCoins;
cout << "面值为 " << cents << " 的最小硬币数 : " << coinsUsed[cents] << endl;
}
}
Reference Url:
http://blog.youkuaiyun.com/JarvisChu/article/details/6056963#
http://blog.163.com/huang_zhong_yuan/blog/static/174975283201110604819214/
http://58.20.53.45/files/files_upload/content/material_177/content/002001/file_2.htm