题意:有21种硬币,第i种的价值是i*i*i,给出一个数额,问有几种方法能组成这个数额。
跟硬币问题一样,可以用记忆化或递推,都可以写成一维的,dp[pri] = dp[pri] + dp[pri - val]。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: uva11137.cpp
* Create Date: 2013-11-09 01:21:37
* Descripton: dp
*/
#include <cstdio>
#include <cstring>
const int MAXN = 10010;
long long dp[MAXN];
int a[30], n;
int main() {
for (int i = 1; i <= 21; i++)
a[i] = i * i * i;
while (scanf("%d", &n) != EOF) {
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 1; i <= 21; i++)
for (int j = a[i]; j <= n; j++)
dp[j] += dp[j - a[i]];
printf("%lld\n", dp[n]);
}
return 0;
}