2008年9月17日

Coin Change

在寫ACM的時候,碰到了兩題(Q674, Q357)是關於這類型的題目,題目的大意如下:
假設我們有一些硬幣的幣值是1元,5元,10元,25元,50元,而我手中有n元,請問n可為幾種硬幣的組成方式。

Ex:n=11
11個1元硬幣=1個1元+2個5元硬幣=6個1元+1個5 元硬幣=1個1元+1個10元硬幣。
所以有4種組成的方式。
輸入值為隨意的n(0<=n<=max),輸出為組成n的方式。 我解這一題的方式是用DP: 令coin[i]為硬幣的幣值,way[i]為i元時,有way[i]種組成的方式,
  1. for (i=0; i<coin.size(); i++)
  2. { 
  3.     for(j=0;j<way.size();j++)       
  4.         way[coin[i]+j] += way[j];     
  5. } 
一開始的時候先計算用1元硬幣時有幾種組成的方式,然後再計算用5元硬幣時有幾種組成方式,以此類推,計算完畢後就是所求的解答。