最少硬币问题

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

算法设计:对于给定的1£n£10 ,硬币面值数组T和可以使用的各种面值的硬币数组Coins,以及钱数m, 0£m£20001,计算找钱m的最少硬币数。

数据输入:由文件input.Txt提供输入数据,文件的第1行中只有一个整数给出n的值,第2行起每行两个数,分别是T[j]和Coins[j]。最后一行是要找的钱数m。

结果输出:将计算出的最少硬币数输出到文件output.txt。问题无解时输出-1。

这个题目,用一个二维的动态转移方程比一维动态转移方程更容易理解。

下面的解法,是基于一维动态转移方程。

/********************************************************************** @file    test.cpp** @author  liuke** @date    Fri Apr 22 23:50:50 2011** @brief   **************************动态规划实现********************************长度为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]中较小的**
//硬币问题就是一个多重背包问题
//动态迁移方程为 dp[k] = min{dp[k-t[i]]+1,dp[k]}
//就是,将第i个硬币拿出去得到的一个最少的找硬币数+1,和原硬币数相比最小的那个就是结果
//另外一种思路,可以将所有的硬币价值都放在一个数组,就变成了0-1背包问题,所需考虑的就是放不放的问题#include<iostream>
using namespace std;
int min(int a,int b);
int main()
{int n; //n种不同面值的硬币int m;int i , j ,k;cout<<"请输入有几种不同的面值:";cin>>n;int *t =new int[n+1];               //硬币的面值存放在t数组中 -- 价值int *coin = new int [n+1];      //可以使用的硬币个数存放在coin中--个数cout<<"请输入"<<n<<"组硬币的面值和对应的个数(中间用空格隔开):"<<endl;for(i = 1 ;i<n+1;i++)cin>>t[i]>>coin[i];cout<<"请输入要找的钱数m:";cin>>m;int dp[20002]={0} ;   //dp[i] 用来记录钱数为i时的最少的硬币数for(i=1;i<=m;i++)dp[i] = 99999;//dp[0] = 0;for(i = 1 ;i <= n ; i++)    //硬币面值的种数for(j = 1 ; j <= coin[i] ; j++)   //硬币的面值的个数for( k = m ; k >= t[i] ;  k-- )    {dp[k] = min(dp[k-t[i]] +1,dp[k]);//cout<<k<<": "<<dp[k]<<endl;  用于测试使用}cout<<"最少需要用到的硬币个数是:";if(dp[m] == 99999)cout<<-1<<endl;else cout<<dp[m]<<"个"<<endl;
}int min(int a,int b)
{return a<b?a:b;
}

最少硬币问题(多重背包问题)相关推荐

  1. 最少硬币问题----多重背包

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

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

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

  3. 最少硬币问题(最多背包问题)可以测试代码过程

    最少硬币问题 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中 ...

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

    Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 设有n种不同面值的硬币,各硬币的面值存 ...

  5. B - 最少硬币问题

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

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

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

  7. 九大背包问题专题--多重背包问题(二进制优化方法;单调队列问题)

    3.多重背包问题1 题目: 有N件物品和一个容量是V的背包. 第i种物品最多有si件,每件的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容量,且价值总和最大. 输 ...

  8. poj 1384 Piggy-Bank 多重背包问题

    题目:点击打开链接 题意:小猪存钱罐,知道一些钱币的总重量,和这些钱币的币值以及单个重量,问这些钱最少是多少? 分析:很明显的一道多重背包问题,dp[v],表示重量为i的钱的币值和,对于达不到给定那个 ...

  9. 硬币找零——背包问题,以及循环、递归、动规共通性

    在这个题目的基础上,我了解了一下这几个"编程写法",并对循环.递归.dp有了新的想法.从原理上,这几个想法都是大事化小.小事化了.只不过方向不同罢了. 根据The Algorith ...

最新文章

  1. 推荐一款 Java 对象映射神器
  2. spring之DelegatingFilterProxy
  3. mac下简单绘图工具
  4. Mysql之外连接_OUTER JOIN
  5. Unparsed aapt error(s)! Check the console for output
  6. 怎么将tflite部署在安卓上_手把手教程:如何从零开始训练 TF 模型并在安卓系统上运行...
  7. 原来算法还能这样用图画出来?
  8. 联想LJ2400清零
  9. 最常用20000英语单词表_受够加班煎熬,我整理出10条职场人士最常用的透视表技巧!(下篇)...
  10. 创业1年半,烧光130万:我总结了哪些教训?
  11. 华人教授世界一流大学观察报告:斯坦福师生吃饭时,谈论的都是什么话题?...
  12. POJ 3322 Bloxorz I
  13. 改变elementui卡片crad样式_Ueditor文字和echarts图片 生成 word 前端解决方案
  14. 我的开源项目从0到1024的过程
  15. 微信小游戏《头脑王者》答题辅助脚本
  16. 安卓录屏软件实现 开维PRA自动生成代码Ctrl.js
  17. 关于进制计算的公式(转换为十进制)
  18. 无线计算机通信网络安全,4G通信技术的无线网络安全通信-网络安全论文-计算机论文(7页)-原创力文档...
  19. 零空间维数的几何意义
  20. 学习软件工程的知名网站

热门文章

  1. java模拟登录知乎_Android(Java) 模拟登录知乎并抓取用户信息
  2. 在晋中市体院馆副馆项目的消防应急照明和疏散指示系统的应用
  3. 健身课Day04-主要侧重左右侧
  4. 深度学习基础--线性回归
  5. java json 压缩_Json压缩工具(示例代码)
  6. “整理电脑文件轻松有序:按大小归类保存,重新定义文件管理体验!“
  7. python解非线性方程组_python scipy求解非线性方程的方法(fsolve/root)
  8. oracle博客管理系统,读赵杰夫博客之ORACLE EBS 系统主数据管理(A)摘录
  9. 即将换到一个自己不熟悉的部门做领导,应该怎么办
  10. jexus 部署asp.net 出现Default错误