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 ...
随机推荐
- iOS 类似微博或朋友圈的信息流
1.先上图: image.png image.png 因为做过了好几次这样的需求,所以这次想到把它拿出来,下次再需要做的时候直接拿过来改改就能用了,节约时间. 2.功能 文字收起和展开,行高自 ...
- iOS App占用太多磁盘空间
问题:随着App的不断运行,发现所占磁盘空间越来越大 分析:应该是网络下载中的缓存,包括利用SDWebImage产生的.和下载单个文件被取消后的缓存 验证:查看App目录中的Tmp(系统存放未下载完成 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 021-024
忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...
- 前端应该掌握的ps知识
你说有美图秀秀之后PS要over了,NO PS 依旧很重要,当然除了修人像,比如切图什么的 来吧 开始吧 在开始切图之前,先科普几个小技巧 1. 如果快速从大图中拿出自己想要的小图 : 需求:快速拿出 ...
- PhpStorm中实现代码自动换行
方法一: 随便打开一个页面,在显示行号(最左边)这里鼠标右击,勾选"Use Soft Wraps". 方法二: 选择"File-->>Settings--&g ...
- centos6.9下安装python3.7
说明 以下所有操作都基于centos6.9 python3.7依赖openssl1.0.2,首先更新系统自带的openssl 建议 升级系统到centos7(系统openssl已升级到1.0.2) 升 ...
- Spark Streaming核心概念与编程
Spark Streaming核心概念与编程 1. 核心概念 StreamingContext Create StreamingContext import org.apache.spark._ im ...
- 关于LP64,ILP64,LLP64,ILP32,LP32字长(数据)模型
太长不看: 1.32位Windows和类Unix使用ILP32字长模型,64位Windows使用ILP64模型,64位类Unix使用LP64字长模型. 2.根据1,long在32位和64位Window ...
- SVN-Tips
一些实际使用中遇到与学习的SVN的TIPS 1.如何从SVN检出maven项目: 1.从svn导入“作为工作空间中的项目检出”--->Finish 2.如“1”操作后,会自动的在MyEclips ...
- 20155230 实验二《Java面向对象程序设计》实验报告
20155230 实验二<Java面向对象程序设计>实验报告 一.单元测试 三种代码 知道了伪代码.产品代码.测试代码的关系和用途,并根据老师的例子,按测试代码调试了产品代码. 值得注意的 ...