最少硬币问题
Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem 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

Sample Output
5

 **************************动态规划实现********************************长度为m的数组f[1...m]中存放一系列子结果,即f[i]为要凑的钱数为i时所需的最少硬币数,则c[m]为所求;当要找的钱数i(1<i<m)与当前所试探的硬币面值k相等时,结果为1,即c[i]=1当i大于当前所试探硬币面值k时,若f[i]为0,即还未赋过值,且c[i-k]不为0,即从i元钱中刨去k元后剩下的钱数可以找开, 则c[i]=c[i-k]+1若f[i]不为0,即已赋过值,则f[i]为f[i-k]+1和f[i]中较小的

原博客
解释下:比如我6块是我需要的m,最开始需要2个1元,2个2元,加一起是6元,4张。中间还可以3张2元的。最后我可以借助5元的大钞把6-1替换。3张2元,最终可以直接用1张5元的和1张1元的替代,一共需要就是之前一元即dp[1]的加上这张5元的,即dp[1] + 1,一共要2张,之前4张,到3,最后2.

先放提交代码,下面有解析和测试代码

#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;int main()
{int n, m;cin>>n;int t[20002];int c[20002];int dp[20002];for(int i = 1; i <= n; i++)cin>>t[i]>>c[i];cin>>m;memset(dp, 0, sizeof(dp));///记得初始化for(int i = 1; i <= m; i++)dp[i] = INF;for(int i = 1; i <= n; i++)///三个循环别出错了{for(int j = 1; j <= c[i]; j++){for(int k = m; k >= t[i]; k--){dp[k] = min(dp[k - t[i]] + 1, dp[k]);///核心代码}}}if(dp[m] == INF)///记得判断,可能无解cout<<"-1"<<endl;elsecout<<dp[m]<<endl;return 0;
}

可以测数据帮助理解

#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;
int main()
{int n, m;cin>>n;///n种钱币int t[20002]; ///面值int c[20002]; ///个数int dp[20002];///用来记录钱为i时的最少硬币数for(int i = 1; i <= n; i++)cin>>t[i]>>c[i];cin>>m;memset(dp, 0, sizeof(dp));///初始化dpfor(int i = 1; i <= m; i++)dp[i] = INF;///对dp[1到m]赋值无穷,方便接下来判断是否有最优解for(int i = 1; i <= n; i++)      ///硬币面值的种数{for(int j = 1; j <= c[i]; j++) ///硬币的面值的个数{for(int k = m; k >= t[i]; k--)///k从大到小,k = m{///cout<<"先K="<<k<<"---"<<"k - t[i]="<<k - t[i]<<"---"<<"dp[k - t[i]] + 1="<<dp[k - t[i]] + 1<<"---"<<"dp[k]="<<dp[k]<<endl;///测试用dp[k] = min(dp[k - t[i]] + 1, dp[k]);///在多个解中找最优的(最小的)///cout<<"后k="<<k<<"---"<<"dp[k]="<<dp[k]<<endl;///测试用///cout<<endl;///测试用}///cout<<"JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"<<endl;///j循环一次结束标志}///cout<<"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"<<endl;///i循环一次结束标志}if(dp[m] == INF)cout<<"-1"<<endl;elsecout<<dp[m]<<endl;return 0;
}//硬币问题就是一个多重背包问题
//动态迁移方程为 dp[k] = min{dp[k-t[i]]+1,dp[k]}
//就是,将第i个硬币拿出去得到的一个最少的找硬币数+1,和原硬币数相比最小的那个就是结果
//另外一种思路,可以将所有的硬币价值都放在一个数组,就变成了0-1背包问题,所需考虑的就是放不放的问题

最少硬币问题(最多背包问题)可以测试代码过程相关推荐

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

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

  2. 最少硬币问题(多重背包问题)

    最少硬币问题 问题描述:设有n种不同面值的硬币,各硬币的面值存在于数组T[1:n]中.现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组Coins[1:n]中.对任意钱数0£m£2000 ...

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

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

  4. B - 最少硬币问题

    B - 最少硬币问题 Description 设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中.现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组Coins[1:n]中. 对任 ...

  5. 动态规划经典题目-找零钱的最少硬币数

    文章目录 一.题目描述 二.解题思路(朴素版本) 1. 定义状态 2. 定义状态转移方程 3. 初始化 三.代码实现 四.优化 五.执行结果 一.题目描述 ​ 美国的硬币按照面值1, 5, 10, 2 ...

  6. 提高C++性能的编程技术笔记:跟踪实例+测试代码

    当提高性能时,我们必须记住以下几点: (1). 内存不是无限大的.虚拟内存系统使得内存看起来是无限的,而事实上并非如此. (2). 内存访问开销不是均衡的.对缓存.主内存和磁盘的访问开销不在同一个数量 ...

  7. python测试代码怎么写_Python 单元测试

    Test your software, or your users will. "Test ruthlessly. Don't make your users find bugs for y ...

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

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

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

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

最新文章

  1. 在IE中测试调用Web Service
  2. tomcat端口号被占用
  3. MySQL各部门求最值_mysql 求分组最大值的十个解法
  4. python中有哪些赋值_python中的赋值,什么时候是传值什么时候是传址?
  5. Fiddler抓包一键生成调用代码
  6. 利用 Celery 构建 Web 服务的后台任务调度模块
  7. 华为matepad 鸿蒙,曝华为4月27日召开高端平板发布会:MatePad Pro2将亮相 首发鸿蒙系统...
  8. 总裁导航V2.5.0-秒收录网站
  9. 漫步最优化十八——点到集合的映射
  10. 分析称地图服务将成移动行业未来
  11. Notepad++ 大小写转换
  12. [vb]SendMessageA函数
  13. 【Oracle】RMAN备份
  14. tomcat,zookeeper,activeMQ,Kafka设置jvm参数
  15. Remix恢复已部署的合约
  16. 高优先权调度算法和高响应比优先调度算法
  17. 《吴军-信息论40讲》摘录
  18. 汉诺塔的图解递归算法
  19. Win7系统怎么开启远程桌面?Win7远程桌面怎么用
  20. 健康数据的获取 Iphone

热门文章

  1. 初学PLC的相关建议
  2. 兰州理工大c语言成绩,中国甘肃网:第三轮学科评估结果公布 兰州理工大16门学科上榜...
  3. 【深度学习】Mac + pycharm环境下 MASK-Rcnn 代码实现过程中的问题
  4. 游戏创作者的宝藏资源:游戏UI数据库
  5. 张小龙谈如何做将产品做简单转自雷锋网
  6. HDClone 磁盘克隆软件,让磁盘复制飞起来
  7. 备战面试日记(3.1) - (设计模式.七大原则)
  8. 基于STM32L431设计的云端绿化管理系统(ESP8266+阿里云物联网平台)
  9. 腾达ac5第三方固件_腾达AC9官方固件修改增强0.5版
  10. 校花干得土得掉渣的事