刷題——Dollar Dayz POJ - 3181

/*
n元錢在一個有1-k元的店裏買東西,每樣東西都是無限的,問有多少種購買方法
dp[i][j]表示i元錢買1-j東西的方法數,畫個圖很容易發現:
dp[i][j]={
        dp[i][j]=dp[i-1][j]:i<j
        dp[i][j]=dp[i-1][j]+dp[i][j-i]
}
題目數據比較大,n=1000,k=100時答案有30多位轉換成大數求解
*/
#include <stdio.h>
#include <string.h>
#define ll long long
char dp[105][1005][50];
int sz(char c){
    if(c)return c-'0';
    return 0;
}
int main(){
    int n,k;
    while(~scanf("%d %d",&n,&k)){
        memset(dp,0,sizeof(dp));
        for(int i=0;i<=k;i++){
            dp[i][0][0]='1';
        }
        for(int i=1;i<=k;i++){
            for(int j=1;j<=n;j++){
                if(j>=i){
                    int jw=0;
                    for(int d=0;dp[i-1][j][d]||dp[i][j-i][d];d++)
                    {
                        int a=sz(dp[i-1][j][d]),b=sz(dp[i][j-i][d]);
                        int temp=(a+b+jw)/10;
                        dp[i][j][d]=(a+b+jw)%10+'0';
                        jw=temp;
                    }
                    if(jw){
                        dp[i][j][strlen(dp[i][j])]=jw+'0';
                    }
                }
                else{
                    for(int d=0;dp[i-1][j][d];d++)
                    dp[i][j][d]=dp[i-1][j][d];
                }
            }
        }
        for(int i=strlen(dp[k][n])-1;i>=0;i--){
            printf("%c",dp[k][n][i]);
        }
        printf("\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章