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;
}

 

-------------------------------------------------------

kedebug

Department of Computer Science and Engineering,

Shanghai Jiao Tong University

E-mail: kedebug0@gmail.com

GitHub: http://github.com/kedebug

-------------------------------------------------------

原文地址:https://www.cnblogs.com/kedebug/p/2779376.html