硬币找零问题 - 动态规划

来源:互联网 发布:mac版unturned怎么汉化 编辑:程序博客网 时间:2024/05/17 05:52


硬币找零问题:要找开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.csdn.net/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


原创粉丝点击