题意:
有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; }