UVa 11137 - Ingenuous Cubrency

传送门

UVa 11137 - Ingenuous Cubrency

题意

和换硬币一样

代码

递推

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 10000 + 100;
 
long long dp[MAXN];
 
int main()
{
    int i, j, n, money;
    dp[0] = 1;
    for (i = 1; i <= 21; i++)
        for (j = i * i * i; j < 10000; j++)
            dp[j] += dp[j - i * i * i];
    while (~scanf("%d", &money))
        printf("%lld\n", dp[money]);
    return 0;
}

记忆化搜索

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 10000 + 100;

long long coin[22], dp[MAXN][22];

long long DFS(int money, int k)
{
    long long &ans = dp[money][k];
    if (ans > 0)
        return ans;
    for (int i = k; i < 21; i++)
        if (money - coin[i] >= 0)
            ans += DFS(money - coin[i], i);
    return ans;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int i, j, k, money;
    for (i = 1; i <= 21; i++)
        coin[i - 1] = i * i * i;
    for (i = 0; i < 22; i++)
        dp[0][i] = 1;
    while (~scanf("%lld", &money))
    {
        long long ans = DFS(money, 0);
        printf("%lld\n", ans);
    }
    return 0;
}

Powered by Jekyll and Theme by solid