博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 674 Coin Change 换钱币【完全背包】
阅读量:5157 次
发布时间:2019-06-13

本文共 1321 字,大约阅读时间需要 4 分钟。

题目大意:

有5种硬币, 面值分别为1、5、10、25、50,现在给出金额,问可以用多少种方式组成该面值。

 

解题思路:

首先我们可以想到,用这些硬币组成11有多少种.

就是组成10的种数,加上组成6的种数,加上组成1的种数,因为这些面值都是加上一枚硬币就得到11了.

然后我们又能继续去求1组成10的种数,那么明显就是9,5,0的组成数的和.

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

 

这道题我还不是很懂,以后再看看。                           >>>

 

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

#include 
#include
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是一种的,所以要处理一下,从小往大排就不会错了。

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

 

2018-04-30

转载于:https://www.cnblogs.com/00isok/p/8974409.html

你可能感兴趣的文章
递归算法
查看>>
http://kb.cnblogs.com/a/1540021/ 赋值
查看>>
4、python内置类型(0529)
查看>>
阻止默认滚轮事件
查看>>
java-小组项目-需求视频
查看>>
R语言之简单回归分析
查看>>
年中团建之军训-回顾
查看>>
BZOJ3598 SCOI2014方伯伯的商场之旅(数位dp)
查看>>
显示器
查看>>
对文件 I/O,标准 I/O 的缓冲的理解
查看>>
Qt——绘图
查看>>
gbk,utf-8,unicode编码,单位换算
查看>>
离散数学 求偏序集中的极大元和极小元
查看>>
CS231n官方笔记授权翻译总集篇发布
查看>>
比较java枚举成员使用equal还是==
查看>>
PPI
查看>>
鲜为人知的空元素╮(╯▽╰)╭
查看>>
【随机过程】马尔可夫链(1)
查看>>
【CUDA开发】CUDA的安装、Nvidia显卡型号及测试
查看>>
【CUDA开发】 CUDA Thrust 规约求和
查看>>