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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值