B - 最少硬币问题

Description

设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。
对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,计算找钱m的最少硬币数。

Input

输入数据第一行中只有1个整数给出n的值,第2行起每行2个数,分别是T[j]和Coins[j]。最后1行是要找的钱数m。

Output

输出数据只有一个整数,表示计算出的最少硬币数。问题无解时输出-1。

Sample

Input

3
1 3
2 3
5 3
18

Output

5

SubmitSolutions

最少硬币问题其实就是多重背包问题,可以这么理解:

第一步:我们现在有面值1,2,5元的硬币各三个,当我们找零金额为0元的时候,显而易见需要的硬币个数为0,即dp[0]=0;

第二步:找零金额为1元时,需要找一个一元即可,因为我们有一元硬币,所以在第一步的基础上加一即可,dp[1]=dp[0]+1=1;

第三步:当i=2时,我们解决的办法是不是可以理解为在找零金额一元的基础上再找给买家一元,即再多找给一个硬币,dp[2]=dp[1]+1=2,但是显然建立在第二步时不是i=2时的最优解,因为我们有两元的硬币,此时的最优解应该建立在第一步上,在第一步的基础上加上一个2元硬币,dp[2]=1;

当我们i=5 的时候情况与i=2类似,需要建立在第一步的基础上加一。

由此来看最少硬币问题似乎是建立在第一步的基本公理上的,但实际情况是第i步的最优解是建立在之前的某一步的最优解上加一得来的,即dp[i]=dp[j]+1;(j<i)

所以用最通俗的话来说就是我们需要凑出 i 元,就在凑出 j 的结果上再加上某一个硬币就行了,具体是哪一个硬币就需要每个都试一次。

dp[i]=dp[j]+1=dp[i-1]+1;||dp[i]=dp[j]+1=dp[i-2]+1;||dp[i]=dp[j]+1=dp[i-5]+1

所有的情况都试出来之后进行比较,取最小的那一种情况就是最优解。

AC代码:

#include<bits/stdc++.h>
#define INF 9999
using namespace std;
struct Coins {//使用结构体比较方便int t;int c;
} coins[20];
int min(int a,int b) {return a>b?b:a;
}
int main() {int n,dp[30000],m;cin>>n;for(int i=1; i<=n; i++) {cin>>coins[i].t>>coins[i].c;}cin>>m;for(int i=1; i<=m; i++) {//对数组进行非0,-1的初始化最好不要用memset,有时会乱码,具体为什么还没搞清楚,不建议用memset,本题数据量较小,老老实实用for循环遍历就好dp[i]=INF;}for(int i=1; i<=n; i++) {for(int j=1; j<=coins[i].c; j++) {for(int k=m; k>=coins[i].t; k--) {dp[k]=min(dp[k],dp[k-coins[i].t]+1);}}}if(dp[m]==INF)cout<<"-1"<<endl;elsecout<<dp[m]<<endl;
}

B - 最少硬币问题相关推荐

  1. java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现

    硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...

  2. python 最小硬币数_Python之动态规划(最少硬币数找零)

    完整代码: # 动态规划最少硬币数找零 def dpMakeChange(coinValueList, change, minCoins, coinsUsed): for cents in range ...

  3. 动态规划(三)——最少硬币和所有硬币问题

    硬币问题 一.最少硬币问题 二.打印最少硬币组合 三.所有硬币组合 3.1硬币数量不限制 3.2硬币数量限制 一.最少硬币问题 有n种硬币,面值为v1-vn,数量无限,选用硬币,使其和金额为s,要求求 ...

  4. 动态规划求解最少硬币是多少?

    多少枚硬币组合问题,最少硬币是多少? 1 确定状态 最后一步(最优策略中使用的最后一枚硬币) 化成子问题(最少的硬币拼出更小面值) 2 转移方程 3 初始条件和边界情况 f[0]=0,如果不能拼出Y, ...

  5. Java实现凑硬币或者最少硬币数

    标题:Java实现凑硬币或者最少硬币数 参考视频:参考视频 建议可以看完视频后,再来写代码,或者看这个blog 示例: 作为dp问题求解: public int coinChange(int[] co ...

  6. 最少硬币问题(c语言实现)

    1.1题目 算法实现题3-2 最少硬币问题 ★问题描述:设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中,现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组 Coins[l:n ...

  7. 算法分析与设计:贪心算法实现最少硬币找钱问题(支付+找零共花费硬币数最少)

    硬币找钱问题 Problem Description 设有六种不同面值的硬币,各硬币的面值分别为 5分,1角,2角,5角,1元,2元.现要用这些面值的硬币来购物和找钱.购物时可以使用的各面值的硬币个数 ...

  8. 最少硬币找零问题(js实现)

    最少硬币找零问题 例如,有以下面额(硬币):1,5,10,5. 如果要找36的零钱,我们可以用1个25的硬币.1个10的硬币和1个1的硬币. 如何将这个解答转化成算法? 今天我们只要采用两种方法来解决 ...

  9. 背包问题一百块最少硬币数

    前言: 看了不少背包问题的讲解: 1.01背包问题,二维实现,滚动数组实现,一维实现: 2.完全背包问题,二维实现,一维实现: 3.多重背包(还没有): 4.筹够一百块求最少硬币数的算法: 自己大概撸 ...

最新文章

  1. 一篇漫画带你了解 Linux 内核长啥样!
  2. RuntimeError: An attempt has been made to start a new process before the current pr
  3. Treasure Exploration
  4. JVM学习笔记(四)
  5. 如何在SAP CRM WebClient UI里创建HANA Live Report
  6. mac ssh远程登录linux,MAC使用SSH远程登录
  7. MiniDao_1.6-SNAPSHOT 版本发布,轻量级Java持久化框架
  8. Oracle数据泵备份与恢复 命令 expdp/impdp 用法详解
  9. python3实用编程技巧_9.python3实用编程技巧进阶(四)
  10. pg批量插入_在PostgreSQL中批量/批量更新/提升
  11. 零基础学python用哪本书好-Python入门到精通学习书籍推荐!
  12. 网站发布(项目上线流程)
  13. 5W1h分析法分析---play框架
  14. 【资讯】1225- Flutter 2.10发布,稳定支持Windows
  15. matlab中逗号分号冒号方括号,matlab中分号、冒号、逗号等常用标点符号的作用,又快又好...
  16. HDU 6069 Counting Divisors
  17. android9 0正式版,安卓9.0系统正式版|Android Pie 9.0 正式版 - 天天游戏吧
  18. 华为鸿蒙魔法闪投大小屏幕互动,「老熊科普」魔法闪投,荣耀智慧屏就是你的“超级大手机”...
  19. 【spark基础】之client模式下--conf读取外部文件
  20. 仲辛醇/水体系的界面现象——Lammps与Gromacs计算结果对比

热门文章

  1. Linux常用命令 实用命令万字总结(转载学习)
  2. 设置文字样式并写入CAD
  3. 年终敬酒万能语句(领导篇)
  4. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!
  5. 河南大学计算机学院魏倩,何欣-计算机与信息工程学院官网
  6. JS 中的 False 与空值
  7. 禅道项目管理,带你避开项目管理中的那些坑
  8. 做人晶莹剔透,做事水滴石穿
  9. 7-214 泰勒级数展开近似sin(x)的值7-215 求班级平均分7-216 同数异形体
  10. 赚钱App研究之格式转换类app