dp算法之硬币找零问题
题目:硬币找零
题目介绍:现在有面值1、3、5元三种硬币无限个,问组成n元的硬币的最小数目?
分析:现在假设n=10,画出状态分布图:
| 硬币编号 | 硬币面值p |
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 编号i/n总数j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 2 | 0 | 1 | 2 | 1 | 2 | 3 | 2 | 3 | 4 | 3 | 4 |
| 3 | 0 | 1 | 2 | 1 | 2 | 1 | 2 | 3 | 2 | 3 | 2 |
设所需硬币最小数目为m,则可以看出m[ i ][ j ]=m[ i-1 ][ j-k*p[ i ]] + k.其中k*p[ i ]<=j.确切的说,k=j/p[ i ].
dp算法的显著特征之一就是具有最优子结构,且这一状态的最优解与上一状态的最优解有关。写出状态方程之后我们就可以开始具体处理代码了。
#include <iostream>
using namespace std;
int main()
{
int i, j, k;
int m, n;//m就是总值
cout << "总数:" << endl;
cin >> m;
//m = 10, ;
n = ;
int **c = new int *[n + ];
for (i = ; i <= n; i++)
{
c[i] = new int[m + ];
}
int p[] = { ,,, };
for (i = ; i <= n; i++)
{
for (j = ; j <= m; j++)
{
c[i][j] = ;//初始化
}
}
for (i = ; i <= n; i++)
{
for (j = ; j <= m; j++)
{
k = j / p[i];
c[i][j] = c[i - ][j - k * p[i]] + k;
}
}
for (i = ; i <= n; i++)
{
for (j = ; j <= m; j++)
{
cout << c[i][j] << " ";
}
cout << endl;
}
return ;
}
分析:这个硬币找零问题在dp算法中比较经典,复杂度低于经典的背包问题,因为背包问题还要考虑 k 的值,需要遍历 k 的值来找到一个最优解,此题不需要。
结果:

下一篇将要分析经典的背包问题了,包括01背包、完全背包、多重背包。
dp算法之硬币找零问题的更多相关文章
- codevs 3961 硬币找零【完全背包DP/记忆化搜索】
题目描述 Description 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该 ...
- NYOJ 995 硬币找零
硬币找零 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...
- [LeetCode] 518. Coin Change 2 硬币找零 2
You are given coins of different denominations and a total amount of money. Write a function to comp ...
- NYOJ995硬币找零(简单dp)
/* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...
- [LeetCode] Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
- 算法笔记_048:找零问题(Java)
目录 1 问题描述 2 解决方案 2.1 动态规划法 1 问题描述 现需找零金额为n,则最少需要用多少面值为d1 < d2 < d3 < ... < dm的硬币?(PS:假 ...
- [LeetCode] 322. Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
- 【ACM小白成长撸】--贪婪法解硬币找零问题
question:假设有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...
- [LeetCode] Coin Change 2 硬币找零之二
You are given coins of different denominations and a total amount of money. Write a function to comp ...
随机推荐
- SpringMVC转发页面405错误
需要在该方法前加上:@ResponseBody注解 加上这个注解后可能在转发页面的时候出现问题,则需要在方法的参数中增加HttpServletRequest 和HttpServletResponse参 ...
- Navicat Premium 12 激活
链接:https://pan.baidu.com/s/1R4WB2JjKd0UYnN00CpUPSA 提取码:e3wy (破解工具及软件安装包) 破解流程:https://www.jianshu.co ...
- http 协议状态码
1xx 信息类状态码 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) 101 - Switching Protocols 服务器将遵从客户 ...
- JavaScript变量类型检测总结
JavaScript中的变量类型: 基本类型值:Undefined,Null,Boolean,Number和String. 按值访问(可直接操作保存在变量中的变量值): 复制规则:当复制基本类型值时: ...
- 在js内生成PDF文件并下载的功能实现(不调用后端),以及生成pdf时换行的格式不被渲染,word-break:break-all
在js内生成PDF文件并下载的功能实现(不调用后端),以及生成pdf时换行的格式不被渲染,word-break:break-all 前天来了个新需求, 有一个授权书的文件要点击下载, 需要在前端生成, ...
- 数据采集与分析的那些事——从数据埋点到AB测试
作者:网易有数郑栋. 一.为什么企业需要一套完善的用户行为埋点和分析平台 产品初创期间,需要分析天使用户的行为来改进产品,甚至从用户行为中得到新的思路或发现来调整产品方向:产品成长过程,通过对用户行为 ...
- 第二篇:shell基础命令(部分)
目录 一.shell命令规则 二.基础命令详解(部分) ls :列出目录内容 mkdir : 创建目录 rmdir :删除目录 touch:新建文件 mv:修改文件(目录)名.移动路径 cp:复制文件 ...
- ubuntu系统部署python3.6.4
Ubuntu的版本为16.04,系统自带的Python版本较低,使用亲本版本3.6.4,下为安装步骤: 一.官网下载Python3.6.4版本 新建目录: sudo mkidr /usr/local/ ...
- 八球胜负 HDU-2537
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ int a,b,n,i; c ...
- 解决 vboxdrv.sh: failed: Cannot change group vboxusers for device /dev/vboxdrv.
来自:https://blog.csdn.net/su_cicada/article/details/86773043 virtualbox 报错 ,看提示让执行以下 sudo /sbin/vboxc ...