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 ... 
随机推荐
- python3爬虫-通过selenium获取TB商品
			from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ... 
- jQuery实现全选、全不选以及反选操作
			在写购物车案例时实现全选操作使用的是js的getAttribute()setAttribute()方法获取checked属性的值是undefined实现完成之后全选操作,如果在全选中的情况下改变其中一 ... 
- 解决vscode换行光标跳转行首
			这个问题是由于设置自动保存而造成的. 解决方法1:取消自动保存. 解决方法2:在首选项的设置里加上"files.autoSaveDelay": 10000,延迟一小会自动保存的时间 ... 
- Oracle之plsql及游标
			--1.赋值 --:= 赋值 declare var_name ) :='&请输入名字';--&是一个提示输入的特殊符号,会打开一个输入框 var_age ) :='&请输入年 ... 
- python  range,xrange区别
			range: 直接生成一个列表对象 xrange: 生成一个xrange对象 xrange使用: 操作一个非常大的数据时,而且没存比较吃紧的时,可以使用xrange来节省内存 xrange一般在循环里 ... 
- css3动画性能优化--针对移动端卡顿问题
			一.使用css,jquery,canvas制作动画 1.Canvas 优点:性能好,强大,支持多数浏览器(除了IE6.IE7.IE8),画出来的图形可以直接保存为 .png 或者 .jpg的图形: 缺 ... 
- 记账本app(1)
			今天开始做做这个app了,加油,目前在看视频,明天正式入手 
- sougoupinyin for linux 安装步骤(精简版)
			download deb double-click to install select fcitx reboot click it in the bar and choose the"tex ... 
- 1009 产生数  2002年NOIP全国联赛普及组
			1009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个整数 n(n< ... 
- Mac OS 上 VIM 8.0 安装体验
			VIM 8.0 赶在中秋前发布 The best way to install Vim on Unix is to use the sources. This requires a compiler ... 
