最小硬币问题_进行更改的最小硬币数量

最小硬币问题

Description:

描述:

This is classic dynamic programming problem to find minimum number of coins to make a change. This problem has been featured in interview rounds of Amazon, Morgan Stanley, Paytm, Samsung etc.

这是经典的动态编程问题,用于寻找进行更改的最小硬币数量。 亚马逊,摩根士丹利,Paytm,三星等公司的采访回合都突出了这个问题。

Problem statement:

问题陈述:

Given a value P, you have to make change for P cents, given that you have infinite supply of each of C { C1, C2, ... ,Cn} valued coins. Find the minimum number of coins to make the change. Return -1 if the change is not possible with the coins provided.

给定一个值P ,由于您拥有C {C 1 ,C 2 ,...,C n }个有价硬币的无限供应,因此您必须为P美分进行更改。 找到进行更改的最小硬币数量 。 如果提供的硬币无法找零,请返回-1

    Input:
Amount P=13
Coin values are:
1, 4, 5 
Output:
3

Explanation with example

举例说明

Let's solve the above example. Total amount is 13 and we have coins with values 1, 4 and 5.

让我们解决以上示例。 总金额为13,我们有价值分别为1、4和5的硬币。

Since, we are to find minimum number of coins and we have infinite number of coin for any denomination, it's apparent that we would go for greedy. We should pick the coin with maximum denomination and keep trying with that until the remaining amount of the change is less the denomination of the coin. Then on course we keep choosing the next best one. So, the algorithm would be like.

因为,我们要找到最小数量的硬币,而对于任何面额我们都拥有无限数量的硬币,所以显然我们会贪婪。 我们应该选择面额最大的硬币,并继续尝试直到零钱的剩余金额少于硬币面额为止。 然后,当然我们会继续选择次佳的。 因此,该算法将是这样。

    1) Let, count=0 to count minimum number of coin used
2) Pick up coin with maximum denomination say, value x
3) while amount≥x
amount=amount-x
count=count+1 
4) if amount=0
Go to Step 7
5) Pick up the next best denomination of coin and assign it to x
6) Go to Step 2
7) End. count is the minimum number of coin used.

Let's see whether the above greedy algorithm leads to the desired result or not.

让我们看看上面的贪婪算法是否导致了期望的结果。

    So, we would pick up 5 first from {1, 4, 5}
We would pick 5 two times
Now amount=3, count=2
Next best coin is 4 but 4 > amount
Next best coin is 1
We would pick 1 three times
Amount=0 and count=5
So, minimum number of coins needed for the change is 5.
But is it really minimum?
If we choose one coin with denomination 5 and two coins with denomination 4, 
it would make the change and coins needed here is (2+1) = 3 
So, greedy does not work as the local optimum choices doesn't make 
global optimum choice. Hence, we need dynamic programming.

Problem Solution Approach

问题解决方法

We have amount M and n number of coins, {C1, C2, ..., Cn}

我们有M个n个硬币, {C 1 ,C 2 ,...,C n }

Now,

现在,

We have two choice for any Cj,

对于任何C j ,我们都有两种选择。

  1. Use Cj and recur for amount M-Cj

    使用C j并递归MC j

  2. Don't use Cj and recur for amount M with other coins

    不要使用C j并与其他硬币重现金额M

(m)= minimum number of coins needed to change amount m

(m)=找零数量m所需的最小硬币数量

formula

We can formulate the above recursion using DP.

我们可以使用DP来制定上述递归。

    // (for any amount 0 to M, minimum number of coins needed is initially infinity) 
1) Initialize DP[M+1] with INT_MAX. 
2) DP[0]=0 //base case of above recursion
3)  for  i=1 to M //iterate amounts
for any coin C_j
If i>=C_j  && DP[i-C_j]≠INT_MAX && DP[i-C_j]+1<DP[i])
DP[i]=DP[i-C_j]+1; //update value
End for
End for   
The result is DP[M]

C++ implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;
int coin_change(vector<int> a, int m, int n)
{
//recursive implementation//
// if(m<0)
// return;
// if(m==0){
//     if(count<min_count)
//     min_count=count;
//     return;
// }
// for(int i=0;i<n;i++){
//     coin_change(a,i,m-a[i],n,count+1);
//     coin_change(a,i+1,m-a[i],n,count+1);
// }
///DP implementation///
//base value
int DP[m + 1];
//initialize
for (int i = 1; i <= m; i++)
DP[i] = INT_MAX;
DP[0] = 0;
for (int i = 1; i <= m; i++) {
for (int j = 0; j < n; j++) {
// if amount > coin value
if (i >= a[j] && DP[i - a[j]] != INT_MAX && DP[i - a[j]] + 1 < DP[i])
// if updation possible update for minimum value
DP[i] = DP[i - a[j]] + 1;
}
}
return DP[m];
}
int main()
{
int n, item, m;
cout << "Enter amount to be changes:\n";
cin >> m;
cout << "Enter number of coins:\n";
cin >> n;
cout << "Enter coin values\n";
vector<int> a;
for (int j = 0; j < n; j++) {
scanf("%d", &item);
a.push_back(item);
}
int ans = coin_change(a, m, n);
if (ans == INT_MAX)
cout << "Coin change not possible" << endl;
else
cout << "Minimum number of coins needed: " << ans << endl;
return 0;
}

Output

输出量

RUN 1:
Enter amount to be changes:
13
Enter number of coins:
3
Enter coin values
1 4 5
Minimum number of coins needed: 3
RUN 2:
Enter amount to be changes:
11
Enter number of coins:
2
Enter coin values
4 5
Coin change not possible

翻译自: https://www.includehelp.com/icp/minimum-number-of-coins-to-make-the-change.aspx

最小硬币问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

补丁(patch)的制作与应用

为什么80%的码农都做不了架构师&#xff1f;>>> 转自http://linux-wiki.cn/wiki/zh-hans/%E8%A1%A5%E4%B8%81(patch)%E7%9A%84%E5%88%B6%E4%BD%9C%E4%B8%8E%E5%BA%94%E7%94%A8 如果hack了开源代码&#xff0c;为了方便分享&#xff08;如提交Bug&#xff09;或自己…

hbase 伪分布安装 java_HBase基础和伪分布式安装配置

一、HBase(NoSQL)的数据模型1.1 表(table)&#xff0c;是存储管理数据的。1.2 行键(row key)&#xff0c;类似于MySQL中的主键&#xff0c;行键是HBase表天然自带的&#xff0c;创建表时不需要指定1.3 列族(column family)&#xff0c;列的集合。一张表中有多个行健&#xff0c…

java script创建对象_JavaScript七种非常经典的创建对象方式

JavaScript创建对象的方式有很多&#xff0c;通过Object构造函数或对象字面量的方式也可以创建单个对象&#xff0c;显然这两种方式会产生大量的重复代码&#xff0c;并不适合量产。接下来介绍七种非常经典的创建对象的方式&#xff0c;他们也各有优缺点。一、工厂模式可以无数…

axis2开发webservice之编写Axis2模块(Module)

axis2中的模块化开发。能够让开发者自由的加入自己所需的模块。提高开发效率&#xff0c;减少开发的难度。 Axis2能够通过模块&#xff08;Module&#xff09;进行扩展。Axis2模块至少须要有两个类&#xff0c;这两个类分别实现了Module和Handler接口。开发和使用一个Axis2模块…

java 看书浏览器官_JAVA读取文件流,设置浏览器下载或直接预览操作

最近项目需要在浏览器中通过url预览图片。但发现浏览器始终默认下载&#xff0c;而不是预览。研究了一下&#xff0c;发现了问题&#xff1a;// 设置response的header&#xff0c;注意这句&#xff0c;如果开启&#xff0c;默认浏览器会进行下载操作&#xff0c;如果注释掉&…

scrapy抓取淘宝女郎

scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看&#xff0c;当然想要爬取更多的话&#xff0c;当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的&#xff0c;这个就有点尴尬了&#xff0c;找了好久没有找到&#xff0c;这里如果有朋…

win10 iot core java_Windows 10 IoT Core 正式版初体验

今天收到Windows 10 IoT Core Team邮件&#xff0c;Windows 10 IoT Core正式发布。以下记录了今天在Raspberry Pi 2上的体验过程&#xff1a;准备工作一台运行着正版Windows 10且版本不小于10240的个人PCVisual Studio 2015 版本不小于14.0.23107.0 D14Rel Install Visual Stud…

VUE2 第五天学习--过渡效果

阅读目录 1.理解VUE---过渡效果回到顶部1.理解VUE---过渡效果 1. 过渡的-css-类名会有4个(css) 类名在 enter/leave 在过渡中切换。1. v-enter: 进入过渡的开始状态。在元素被插入时生效&#xff0c;在下一个帧移除。2. v-enter-active: 进入过渡的结束状态。在元素被插入时生效…

国家可持续发展议程创新示范区创建工作推进会在北京召开

2019独角兽企业重金招聘Python工程师标准>>> 为推进地方申报国家可持续发展议程创新示范区相关工作&#xff0c;根据国家可持续发展议程创新示范区创建工作的进展及需求&#xff0c;2017年4月23日—25日&#xff0c;科技部社会发展科技司、中国21世纪议程管理中心在…

BlockingQueue详解

前言&#xff1a; 在新增的Concurrent包中&#xff0c;BlockingQueue很好的解决了多线程中&#xff0c;如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类&#xff0c;为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所…

[QGLViewer]3D场景鼠标点击位置

重载鼠标事件&#xff1a; void AxMapControl::mousePressEvent(QMouseEvent* e) {switch(currentTool){case AX_DRAW_DIRECTION:{if (e->button() Qt::LeftButton) {QPoint screenPte->pos();qglviewer::Vec orig1, dir1;camera()->convertClickToLine(screenPt, or…

can收发器 rx_CANOpen系列教程03 _CAN收发器功能、原理及作用

1写在前面前面文章是从大方向介绍了CAN网络&#xff0c;让大家对CAN网络有一定的认识。本文将范围缩小&#xff0c;讲述整个CAN网络其中的一个CAN收发器。如下图标记出来的部分&#xff1a;本文结合众多初学者容易产生的疑问来讲述CAN收发器相关的知识点&#xff0c;大概有如下…

centos php fpm 停止_如何关闭php-fpm进程?

因为你是编译的&#xff0c;可以在源码中复制php-fpm的init文件到系统中&#xff1a;cp -f sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm然后就可以使用以下命令启动、停止、重启和重新加载php-fpm了&#xff1a;service php-fpm startservice php-fpm restartservice php-fpm…

Mongodb聚合函数

插入 测试数据 for(var j1;j<3;j){ for(var i1;i<3;i){ var person{Name:"jack"i,Age:i,Address:["henan","wuhan"],Course:[{Name:"shuxue",Score:i},{Name:"wuli",Score:i}]}db.DemoTest.Person.insert(pers…

php rename函数_php rename函数怎么用

PHP rename()函数用于重命名文件或目录&#xff0c;语法“rename(文件旧名称,新名称,句柄环境)”&#xff0c;使用用户指定的新名称更改文件或目录的旧名称&#xff0c;并且可以根据需要在目录之间移动&#xff1b;成功时返回True&#xff0c;失败时返回False。php rename()函数…

Spring Data Redis实战之提供RedisTemplate

为什么80%的码农都做不了架构师&#xff1f;>>> 参考&#xff1a; http://www.cnblogs.com/edwinchen/p/3816938.html 本项目创建的是Maven项目 一、pom.xml引入dependencies <dependency><groupId>org.springframework.data</groupId><artif…

php映射,PHP实现路由映射到指定控制器

自定义路由的功能&#xff0c;指定到pathinfo的url上,再次升级之前的脚本SimpleLoader.phpclass SimpleLoader{public static function run($rulesarray()){header("content-type:text/html;charsetutf-8");self::register();self::commandLine();self::router($rule…

Commonjs规范及Node模块实现

前面的话 Node在实现中并非完全按照CommonJS规范实现&#xff0c;而是对模块规范进行了一定的取舍&#xff0c;同时也增加了少许自身需要的特性。本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于javascript的&#xff0c;在javascript中的顶层对象是window&#xff0c;而在…

thinkphp3 php jwt,ThinkPHP5 使用 JWT 进行加密

- 使用 Composer安装此扩展- 代码示例<?php /*** [InterCommon-接口公用]* Author RainCyan* DateTime 2019-08-12T16:38:080800*/namespace app\hladmin\controller;use think\Controller;use \Firebase\JWT\JWT;class InterCommonController extends Controller {private…

JavaWeb网上图书商城完整项目--day02-14.登录功能的login页面处理

1、现在注册成功之后&#xff0c;我们来到登录页面&#xff0c;登录页面在于 在登录页面。我们也需要向注册页面一样对登录的用户名、密码 验证码等在jsp页面中进行校验&#xff0c;校验我们单独放置一个login.js文件中进行处理&#xff0c;然后login.jsp加载该js文件 我们来看…