最少硬币问题(无穷硬币)

 1 /*贪心可能导致无解;
 2  硬币系统是10,7,5,1元,那么12元用贪心法得到的硬币数为3,而最少硬币数是2。
 3  对于此题,可以举个例子:
 4     若有1,5,7,10这四种货币,则易知
 5     1=1
 6     2=1+1
 7     3=1+1+1
 8     ……
 9     6=5+1
10  那么推下去可知
11          表示12这个面值需要的货币数,等于表示11或7或5或2需要的货币数+1。
12          那么题中若要求表示12所需用的最小货币数,只需寻找表示11或7或5或2需要的货币数中的最小值。
13
14  */
15
16  //硬币数无穷
17  #include <iostream>
18  #include <cstring>
19  using namespace std;
20
21  int coinValue[] = { 25, 21, 10, 5, 1 }; //硬币系统
22  int money = 63;//钱数
23  int coinUsed[100];//每种数量的钱币所需最少硬币数
24
25  void solve()
26  {
27      int i,j,k;
28      int len = sizeof(coinValue)/sizeof(coinValue[0]);
29      memset(coinUsed,0,sizeof(coinUsed));
30
31      for(i=1; i<=money; i++)//递推
32      {
33          int minCoins = i/coinValue[len-1];
34          int temp = 0;
35          for(j=0; j<len; j++)
36          {
37              if(i>=coinValue[j])
38              {
39                  temp = coinUsed[i - coinValue[j]] + 1;
40                  /*
41                  在temp赋初值为0时,下面的if不能和外层if并列,改为1貌似对了
42                  money=1时前几次 内层for未执行,此时 minCoins变为0了,到内层最后temp变为1,不过此时 minCoins还是0,所以就错了
43                  */
44                  if(minCoins>temp)
45                      minCoins = temp;
46              }
47
48          }
49          coinUsed[i] = minCoins;
50      }
51  }
52
53  int main()
54  {
55      int i,j,k;
56      solve();
57      cout<<coinUsed[money]<<endl;
58      while(1);
59      return 0;
60  }

 

时间: 2024-09-28 22:31:14

最少硬币问题(无穷硬币)的相关文章

最少硬币问题(受限)NK1132

1132: 最少硬币问题 Time Limit: 1500 ms    Memory Limit: 10000 kB   Total Submit : 909 (187 users)   Accepted Submit : 241 (132 users)   Page View : 9030  Font Style: Aa Aa Aa 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中.现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组Coins[1:n]中.对任意钱数0

最少硬币问题

<<问题描述: 有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱:各面值的个数存在数组Num[1:n]中. 对于给定的1<=n<=10,硬币面值数组.各面值的个数及钱数m,0<=m<=2001,编程计算找钱m的最少硬币数. input : 第一个数字n,后面n行每行两个数,面值T[i],面值个数Num[i];最后是钱数m. output:最少硬币数. Sample intput :             3             1 3

编程算法之硬币问题 代码(C)

题目: 有1, 5, 10, 50, 100, 500元硬币各若干枚, 现在要用这些硬币来支付A元, 最少需要多少枚硬币? 假定本题至少存在一种支付方案. 使用贪心算法, 优先选用最大的硬币, 并不断的调整硬币的数量. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <limits.h> #inc

1个掷硬币问题,4个Python解法:读书笔记

首发于知乎,再发到阿里社区看看人气如何 关键词:统计,概率,机器学习,Pandas, Numpy, sympy scipy 预计阅读时间-10分钟 我在学习机器学习算法和玩Kaggle 比赛时候,不断地发现需要重新回顾概率.统计.矩阵.微积分等知识.如果按照机器学习的标准衡量自我水平,这些知识都需要重新梳理一遍. 网上或许有各种各样知识片断,却较难找到一本书将概率,统计.矩阵.微积分公式和Python结合起来. 要么是讲的比较浅显,要么跨度比较大. 最近看到一本书,恰好把上面的问题解决了.着重讲

job:经典逻辑训练题(1-39)(持续解答)

今天这里放上75道逻辑训练题目,这里每天至少完成一道题目的训练,答案放在题目下方.题目数量也在持续增加收集. 题目放上:  1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 答:    1.先把5升的灌满,倒在6升里,这时6升的壶里有5升水    2.再把5升的灌满,用5升的壶把6升的灌满,这时5升的壶里剩4升水   3.把6升的水倒掉,再把5升壶里剩余的水倒入6升的壶里,这时6升的壶里有4升水   4.把5升壶灌满,倒入

智力测试

[1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. [2] 周雯的妈妈是豫林水泥厂的化验员. 一天,周雯来到化验室做作业.做完后想出去玩. "等等,妈妈还要考你一个题目,"她接着说,"你看这6只做化验用的玻璃杯,前面3只盛满了水,后面3只是空的.你 能只移动1只玻璃杯,就便盛满水的杯子和空杯子间隔起来 吗?" 爱动脑筋的周雯,是学校里有名的"小机灵",她只想了一会儿就做到了

c语言贪婪算法算法-算法思想

在贪婪算法(greedy method)中采用逐步构造最优解的方法.在每个阶段,都作出一个看上去最优的决策(在一定的标准下).决策一旦作出,就不可再更改.作出贪婪决策的依据称为贪婪准则(greedy criterion). 例1-4 [找零钱] 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员.售货员希望用数目最少的硬币找给小孩.假设提供了数目不限的面值为2 5美分.1 0美分.5美分.及1美分的硬币.售货员分步骤组成要找的零钱数,每次加入一个硬币.选择硬币时所采用的贪婪准则如下:每一次

常用的算法思想总结

对于计算机科学而言,算法是一个非常重要的概念.它是程序设计的灵魂,是将实际问题同解决该问题的计算机程序建立起联系的桥梁.接下来,我们来看看一些常用的算法思想. (一)穷举法思想 穷举法,又称为强力法.它是一种最为直接,实现最为简单,同时又最为耗时的一种解决实际问题的算法思想. 基本思想:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案. 使用穷举法思想解决实际问题,最关键的步骤是划定问题的解空间,并在该解空间中一一枚举每一个可能的解.这里有两点需要注意,一是解空

遗传算法、贪婪算法、粒子群算法、蚂蚁算法概念简介

遗传算法 遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等.遗传算法通常实现方式为一种计算机模拟.对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化.传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法.进化从完全随机个体的种群开始,之后一代一代发生.在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应