UVa 11137 Ingenuous Cubrency(简单DP)

题意:

有1^3, 2^3, ...... , 21^3 种货币,给定一个价钱n,问有多少种组合方法。

思路:

dp[i, j]表示前i种货币表示j钱有多少种表示方法。

1. dp[i-1, j] 用前i-1种货币表示j

2. dp[i, j-v] 前i种货币表示j-v,再加上v便是必须有第i种货币来表示j

仔细发现可以压缩成一维数组 dp[i] = dp[i] + dp[i-v]。

#include <cstdio>

#include <cstdlib>

#include <cstring>



const int MAXN = 10010;

long long int dp[MAXN];

int a[30];



int main()

{

    int n;

    for (int i = 1; i <= 21; ++i)

        a[i] = i * i * i;



    while (scanf("%d", &n) != EOF)

    {

        for (int i = 0; i <= n; ++i)

            dp[i] = 1;



        for (int j = 2; j <= 21; ++j)

            for (int i = a[j]; i <= n; ++i)

                dp[i] += dp[i-a[j]];

        

        printf("%lld\n", dp[n]);

    }

    return 0;

}

 

你可能感兴趣的:(uva)