题目:
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。
例如,给定了7种钱币面值为6 2 5 10 20 50 100,用来凑299元,可以用几种方案。我们的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。

思路:
1、对于这个硬币问题,我们每次都是取硬币,或者不取硬币。因此我们可以将这个硬币问题切割成若干个子问题(取不取这种硬币),而且每次决策都会用到这个子问题。而且所有的子问题中必定存在最优解。
2、每次取硬币,都仅仅是做出决策,判断是否取这若干种硬币,每次决策之后,除了n块钱会改变之外,其他都没有改变,都是判断是否取这若干种硬币的一种,因此可以说硬币问题无后效性。
3、递推方程
dp[i]表示金额为i时,最少钱币组合。对每个v(j),尝试用硬币v(j)找钱,v(j)<=i时,dp(i)=min{dp(i),num(i-v(j))+1},找出取硬币和不取硬币两种决策所得的最少硬币数组合。
4、这个问题必须用动态规划,不能使用贪心策略,因为贪心算法只考虑当前步,动态规划考虑整体。

代码:

#include <bits/stdc++.h>
#define Infiniti 1000000 //定义最大值
#define MAX 20 //定义个数
using namespace std;
int v[MAX];//存储所有币值
int dp[MAX];//存放1到n的各个值所需的币数
int Contain(int v[],int n,int s) //n为v的len,s为金额
{   int i,j,t;dp[0]=0; //初始化,币值刚好可以付清 for(i=1;i<=s;i++) //初始化dp数组其他值为最大值 {dp[i]=Infiniti;}for(i=1;i<=s;i++) //从1到s的各个值所需的最小币数情况 {for(j=1;j<=n;j++) //尝试每一种币值 {if(i>=v[j]) //币值可以支付当前金额 dp[i]=min(dp[i],dp[i-v[j]]+1);//每种币值可以选择取或不取,最终求最小币数组合情况 }}return dp[s]; //返回金额为s时最小钱币数
}
void Show(int s,int n,int t)
{int i,a[MAX],j=0; //j保存币值个数 while(s) //需支付金额不为0时 {for(i=n;i>0;i--){//可以使用该币值且使用后余下金额仍符合最小组合 if(s-v[i]>=0&&dp[s-v[i]]==t-1){a[j++]=v[i]; //保存币值 s-=v[i]; //总金额减少 t--; //需找出的币数减少 break; //符合条件则跳出循环,寻找下一个s的组合 }}}for(i=0;i<j;i++)cout<<a[i]<<" ";
}int main()
{int n,s,t;cout<<"请输入钱币种数:";cin>>n;cout<<"请依次输入各种钱币的面值:";for (int i=1;i<=n;i++)cin>>v[i];cout<<"请输入钱数:";cin>>s;t=Contain(v,n,s);if(t>=Infiniti) //各面值无法组合成给定s cout<<"Error!";else{cout<<"共需个数:"<<t<<endl;cout<<"各个币值为:";Show(s,n,t);} return 0;
}

运行:

动态规划——最小找钱问题相关推荐

  1. 动态规划—最小路径和

    问题描述:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小.每次只能向下或者向右移动一步. 算法思路: 采用动态规划,将上述矩阵转为下 ...

  2. 动态规划——最小路径和(Leetcode 64)

    题目选自Leetcode 64.最小路径和 题目描述 解题思路 前言: 解题的方法是用动态规划~ 从数据范围可以看出,n.m最多就是200×200的大小,所以dp数组就开201 那么,怎么进行动态规划 ...

  3. 动态规划---最小硬币数(Python)

    目录 一.具体题目 二.思路 三.扩展 一.具体题目 有3种硬币,面值分别为2元.5元.7元,每种硬币数量都无穷多.求拼成27元的最少硬币数. 二.思路 这个题目乍一看可能很多人认为要用贪心策略,就是 ...

  4. 动态规划 最小编辑代价

    题目描述: 给定两个字符串str1和str2,再给定三个整数ic,dc,rc,分别代表插入.删除.替换一个字符的代价,返回将str1编辑成str2的最小代价. 举例: str1="abc&q ...

  5. 动态规划示例汇总-Java版(组合硬币、跳台阶、最小路径和、最长递增子序列、最长公共子序列、01背包问题、最小编辑代价)

    动态规划算法示例汇总-Java版 组合硬币 Java解题-暴力搜索 Java解题-记忆搜索 Java解题-动态规划(两种写法) 跳台阶 Java解题-暴力递归 Java解题-动态规划 矩阵最小路径和 ...

  6. 算法练习day15——190403(简介、求n!、汉诺塔、打印字符串的子序列、打印字符串的全排列、母牛生小牛、最小路径和、累加和是否达到给定值)

    1. 简介 动态规划是为了优化暴力尝试的. 2. 求n! 2.1 一般思路 public static long getFactorial2(int n) {long result = 1L;for ...

  7. 动态规划——坐标型位操作型

    动态规划--坐标型&位操作型 坐标型动态规划--带阻碍的唯一路径 序列型动态规划--油漆房子 划分型动态规划--解密方式 坐标型动态规划--最长上升连续子序列 坐标型动态规划--最小路径和 坐 ...

  8. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  9. 判断是否为二叉排序树的递归算法_左神直通BAT算法笔记(基础篇)

    时间复杂度 空间复杂度 经典例题 找出B中不属于A的数 荷兰国旗问题 矩阵打印问题 岛问题 经典结构和算法 字符串 KMP算法 前缀树 数组 冒泡排序 选择排序 插入排序 归并排序 快速排序 堆排序 ...

  10. 《剑指offer》75题 C++详细题解

    目录 简单: 剑指 Offer 03. 数组中重复的数字 map: unordered_map: 原地交换 剑指 Offer 05. 替换空格 剑指 Offer 06. 从尾到头打印链表 出栈入栈 双 ...

最新文章

  1. cisco路由器针对进行ip限速
  2. java简单工厂模式_Java 简单工厂模式
  3. 8086指令(II)
  4. VMware安装Centos7后有线线缆被拔出
  5. 统计学习方法(—)——统计学习方法概念
  6. verilog 学习记(mac安装iverilog和gtkwave)
  7. Spring包的方法WebUtils.getParametersStartingWith(request,String)
  8. python改变背景颜色_python中绘图时怎么改背景颜色?
  9. 机器学习实战系列(八):分类与回归树
  10. linux日常学习笔记
  11. 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元
  12. no SSL-C headers found
  13. 【优化算法】萤火虫优化算法(FA)【含Matlab源码 482期】
  14. ADSL防御黑客攻击的十大方法(转)
  15. 含论文答辩PPT任务书源码等基于SSM框架演唱会网上订票系统
  16. *Php消息队列实现
  17. 为什么提问能力很重要?
  18. 计算机函数sumif求平均值,EXCEL的经典函数sumif的用法和实例(详细汇总)_excel函数_office之家...
  19. 一切成功源于积累——20140928 认识货币——瑞士法郎
  20. 拯救rm-rf删库事故

热门文章

  1. 高级系统架构师培训笔记
  2. vite 预编译实现
  3. 金庸小说中的八大经典战役回顾
  4. 新增网站组网方案与解释说明 模版
  5. win10找不到网络里的计算机,Win10专业版找不到网络中的其他电脑
  6. css三角形的IE兼容写法
  7. 研究了1天的ckfinder记录
  8. 人脸识别技术和人脸识别特征
  9. MATLAB做驻波,SMB色谱分离驻波优化设计的一种Matlab实现
  10. 架构漫谈专栏系列文章