錢幣兌換問題

題目鏈接:

https://vjudge.net/contest/348156#problem/K

題面:

在這裏插入圖片描述

思路:

這道題目就需要學習一種思路:
他是要求完全揹包的分配方案數,和原先學習的完全揹包不太一樣。
思想就是每次更改一個硬幣的面值(當然因此剩餘的錢要相應減少),比如4的話:
可以有3種情況:

1,1,1,1
1,1 , ,2
2 ,, ,2
然後你會發現2的話是:
1,1
2
4可以看作是隻換成1的方案數 加上 2能換成任意麪值的方案數 的總和,因爲剩餘的兩種方案只是在得到2以後加上一張2面值的硬幣,所以有如下規律:f(n)=f ( n - v[i] )+f( n );即:n的方案數=n已有的方案數+添加一種新的面值的方案數,這裏每次添加的新的面值就一個,所以f(n- v [i] )是等於f(填一個新的面值的硬幣)的。

參考代碼:

#include <stdio.h>
#include <string.h>
#include <math.h>
int dp[50000];
int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF){
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(i=1;i<=3;i++)
        {
            for(j=i;j<=n;j++)
            {
                dp[j]=dp[j]+dp[j-i];
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章