ACM UVA-147

DP,其實跟爬階梯很像,都假設每個幣值是最後一個放進去的,例如題目給10元,十元的組合可以從一個5元加上一個5元算出來,其實就等於加上d[10-5]。假設一開始先測5元的,那麼我們可以算出十元的可以由一個五元加上一個五元組成,下一個階段測10元的,那麼我們又可以算出一個十元可以由一個十元所組成(d[10-10] = d[0],所以d[0]要設成1)。那下次就是從幣值大於十元的開始算,假設幣值是20元,理所當然20元之前的都已經被算完了,因為都小於20元,20元根本放不進去(所以這題也有點類似背包問題)。

by the way,這程式一開始忘記初始化,結果變得很奇怪XD。

int main(int argc, char const* argv[])
{
    int money[] = {10000,5000,2000,1000,500,200,100,50,20,10,5};
    unsigned long long dp[30001] = {0};
    dp[0] = 1;
    for(int i = 10;i >= 0;i--)
        for(int j = money[i];j <= 30000;j = j+5){
            dp[j] = dp[j]+dp[j-money[i]];
        }
    int left,right;
    while(scanf("%d.%d",&left,&right) != EOF && !(left == 0 && right == 0)){
        printf("%3d.%02d%17llu\n",left,right,dp[left*100+right]);
    }


    return 0;
}