1. 程式人生 > >hdu 1284 錢幣兌換問題(動態規劃)

hdu 1284 錢幣兌換問題(動態規劃)

完全揹包:

#include<stdio.h>
#include<string.h>
int dp[4][40000];
int main(void)
{
    int i,j,n;
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(i=1; i<=3; i++)
    {
        for(j=0; j<32770; j++)
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-i];
        }
    }
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",dp[3][n]);
    }
    return 0;
}

完全揹包-滾動陣列法:

#include<stdio.h>
#include<string.h>
int dp[40000];
int main(void)
{
    int i,j,n;
    memset(dp,0,sizeof(dp));
    dp[0]=1;
    for(i=1; i<=3; i++)
    {
        for(j=i; j<32770; j++)
        {
            dp[j]+=dp[j-i];
        }
    }
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",dp[n]);
    }
    return 0;
}

和N層樓梯,最多一次上k次的不同在於,這個的2 1 2和2 2 1,也就是順序的不同是算作一次的,在程式中的體現在於,樓梯問題的J是從1開始遍歷,這個是從i開始遍歷。