hdu 1284 錢幣兌換問題(動態規劃)
阿新 • • 發佈:2019-02-01
完全揹包:
#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開始遍歷。