UVA 11137 Ingenuous Cubrency 类似硬币问题的简单dp

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


你可能感兴趣的:(dp,ACM)