UVA 674 Coin Change 换硬币 经典dp入门题

题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数。

经典的dp题。。。可以递推也可以记忆化搜索。。。

我个人比较喜欢记忆化搜索,递推不是很熟练。


记忆化搜索:很白痴的算法,直接交给下一层去算,算完记录下来以免之后重复算。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.csdn.net/hcbbt
*  File:        _uva674.cpp
*  Create Date: 2013-09-20 14:00:42
*  Descripton:  dp, memorial 
*/

#include <cstdio>
#include <cstring>
const int MAXN = 8000;
const int coin[5] = {1, 5, 10, 25, 50};
int n;
long long dp[MAXN][5];

long long solve(int i, int s) {
	if (dp[s][i] != -1)
		return dp[s][i];
	dp[s][i] = 0;
	for (int j = i; j < 5 && s >= coin[j]; j++)
		dp[s][i] += solve(j, s - coin[j]);
	return dp[s][i];
}

int main() {
	memset(dp, -1, sizeof(dp));
	for (int i = 0; i < 5; i++)
		dp[0][i] = 1;
	while (scanf("%d", &n) != EOF)
		printf("%lld\n", solve(0, n));
	return 0;
}


递推:自底向上的方法,需要注意的是1+5和5+1是一种的,所以要处理一下,从小往大排就不会错了。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.csdn.net/hcbbt
*  File:        uva674.cpp
*  Create Date: 2013-09-20 13:48:56
*  Descripton:  dp, low to up
*/

#include <cstdio>
const int MAXN = 8000;
int n, coin[5] = {1, 5, 10, 25, 50};
long long dp[MAXN] = {1};

int main() {
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < MAXN - 100; j++)
			dp[j + coin[i]] += dp[j];

	while (scanf("%d", &n) != EOF)
		printf("%lld\n", dp[n]);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值