`
wusuoya
  • 浏览: 644137 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

动态规划找零问题O(nk)

 
阅读更多

主要思路是,用一个数组coinsUsed[]来保存找i分钱所需的硬币数,(i==maxchange就是我们正在寻找的解),用一个数组lastCoin[]来保存哪一个硬币是最后用来得到最佳找零方案的信息。coins[] 用来记录硬币零钱有哪几种,differentCoins记录下coins[]的长度。maxChange记录最后的要兑换的零钱数。该算法复杂度为O(NK),N为不同面值的硬币数目,K是我们要找的的零钱数量。

 

 

 

Java代码   收藏代码
  1. public final class MakeChange  
  2. {  
  3.     // Dynamic programming algorithm to solve change making problem.  
  4.     // As a result, the coinsUsed array is filled with the  
  5.     // minimum number of coins needed for change from 0 -> maxChange  
  6.     // and lastCoin contains one of the coins needed to make the change.  
  7.     public static void makeChange( int [ ] coins, int differentCoins,  
  8.                 int maxChange, int [ ] coinsUsed, int [ ] lastCoin )  
  9.     {  
  10.         coinsUsed[ 0 ] = 0; lastCoin[ 0 ] = 1;  
  11.   
  12.         forint cents = 1; cents <= maxChange; cents++ )  
  13.         {  
  14.             int minCoins = cents;  
  15.             int newCoin  = 1;  
  16.   
  17.             forint j = 0; j < differentCoins; j++ )  
  18.             {  
  19.                 if( coins[ j ] > cents )   // Cannot use coin j  
  20.                     continue;  
  21.                 if( coinsUsed[ cents - coins[ j ] ] + 1 < minCoins )  
  22.                 {  
  23.                     minCoins = coinsUsed[ cents - coins[ j ] ] + 1;  
  24.                     newCoin  = coins[ j ];  
  25.                 }  
  26.             }  
  27.   
  28.             coinsUsed[ cents ] = minCoins;  
  29.             lastCoin[ cents ]  = newCoin;  
  30.         }  
  31.     }  
  32.   
  33.     // Simple test program  
  34.     public static void main( String [ ] args )  
  35.     {  
  36.         // The coins and the total amount of change  
  37.         int numCoins = 5;  
  38.         int [ ] coins = { 15102125 };  
  39.         int change = 0;  
  40.   
  41.         if( args.length == 0 )  
  42.         {  
  43.             System.out.println( "Supply a monetary amount on the command line" );  
  44.             System.exit( 0 );  
  45.         }  
  46.   
  47.         try  
  48.           { change = Integer.parseInt( args[ 0 ] ); }  
  49.         catch( NumberFormatException e )  
  50.         {  
  51.             System.out.println( e );  
  52.             System.exit( 0 );   
  53.         }  
  54.   
  55.         int [ ] used = new int[ change + 1 ];  
  56.         int [ ] last = new int[ change + 1 ];  
  57.   
  58.         makeChange( coins, numCoins, change, used, last );  
  59.   
  60.         System.out.println( "Best is " + used[ change ] + " coins" );  
  61.   
  62.         forint i = change; i > 0; )  
  63.         {  
  64.             System.out.print( last[ i ] + " " );  
  65.             i -= last[ i ];  
  66.         }  
  67.         System.out.println( );  
  68.     }  

详细解释可参见教材P89

 

分享到:
评论
1 楼 msn877763580 2011-10-06  
数据结构与问题求解------

相关推荐

    硬币找零动态规划C语言实现

    一个简单的动态规划算法实例,实现硬币找零的最小硬币数以及每种面额硬币的数量。

    python数据结构与算法分析,动态规划—找零问题.py

    python数据结构与算法分析,动态规划—找零问题.py

    动态规划求解找零问题和背包问题C++代码

    01背包问题是一个经典的动态规划问题,目标是在给定容量的背包中选择物品,使得物品的总价值最大化,但每个物品只能选择一次。这个问题同样采用动态规划的自底向上策略来解决。 1. 定义状态:`V[i][j]`表示前`i`个...

    找零动态规划算法

    在计算机科学领域,动态规划是一种强大的算法,常用于解决复杂问题,通过将大问题分解为更小的子...通过阅读这些文件,你可以进一步理解动态规划在找零问题中的应用,以及C++和C语言在处理这类问题时的不同实现方式。

    java动态规划算法——硬币找零问题实例分析

    Java 动态规划算法——硬币找零问题实例分析 Java 动态规划算法是解决复杂问题的一种有效方法,通过将大问题分解成小问题,从而逐步解决问题。在本文中,我们将通过实例分析 Java 动态规划算法——硬币找零问题,...

    Java动态规划之硬币找零问题实现代码

    Java动态规划之硬币找零问题实现代码 Java动态规划是一种非常重要的算法思想,通过将问题分解成多个子问题,先求解子问题,然后将这些子问题的解保存起来,以便在求解较大子问题时可以直接使用这些已经计算过的解,...

    动态规划例题源代码

    在这个“动态规划例题源代码”中,包含了解决三个经典问题的Python代码:硬币找零问题、采矿问题和爬楼梯问题。让我们逐一深入探讨这三个问题及其对应的动态规划解决方案。 1. **硬币找零问题**: 这个问题的目标...

    ConsoleApplication20_算法设计与分析之动态规划求解硬币问题_

    在这个“算法设计与分析之动态规划求解硬币问题”的案例中,我们将探讨如何使用动态规划方法来解决一个经典的组合优化问题:硬币找零问题。 硬币找零问题的基本设定是这样的:你有一组不同面值的硬币,目标是找出...

    什么是动态规划(Dynamic Programming)?动态规划的意义是什么? - 知乎1

    动态规划(Dynamic Programming,简称DP)是一种用于解决最优化问题的算法思想,它通过将大问题分解为相互重叠的子问题,并存储子问题的解,以避免重复计算,从而达到高效求解的目的。DP的核心在于它能够识别并利用...

    贪心算法找零问题代码

    在这个"贪心算法找零问题"中,我们通常面对的是如何用最少数量的硬币来支付给顾客找零的问题。在超市找零的情境下,这个问题变得尤为实际。 在C++编程中,我们可以构建一个贪心算法来解决这个问题。首先,我们需要...

    贪心算法的设计,关于背包问题和超市找零,详细解说

    详细的背包问题和超市找零问题的解说, 代码详细,注释清除,方便使用

    C 语言实现钱币找零问题,使用贪心算法实现

    下面是一个使用C语言实现的贪心算法示例,即“钱币找零问题”,目标是用最少的钱币数量来找零。 **题目:**给定不同面额的钱币和一个总金额,使用贪心算法计算出最少需要多少个钱币来凑出这个总金额。 要求: 1、...

    动态规划之找零钱问题

    动态规划是一种强大的算法设计策略,常用于解决复杂问题,如找零钱问题。在这个问题中,我们通常要找出最少数量的硬币来组成一个给定的金额,假设我们有一组不同面额的硬币可用。这是一个典型的组合优化问题,动态...

    [6.4.1]--411找零兑换问题的动态规划解法.srt

    [6.4.1]--411找零兑换问题的动态规划解法.srt

    [6.4.1]--411找零兑换问题的动态规划解法.mp4

    [6.4.1]--411找零兑换问题的动态规划解法.mp4

    动态规划算法讲稿 ACM

    1. **基本概念**:动态规划问题通常定义为一个状态转移方程,其中每个状态代表问题的一个部分解,而状态间的转移则反映了问题的结构。状态转移方程描述了解决问题的步骤,即如何从已知的子问题状态推导出更大的问题...

    11085 买票找零

    11085 买票找零 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 一场激烈足球赛即将开始,售票员紧张地卖票着……。 每张球票50元,现在有2n(1)个球迷排队...

    c#编写的代码包括递归的排列和半数集,动态规划的导弹问题,贪心算法的找零钱问题

    然而,贪心算法并不总是适用于所有情况,因为有些找零问题可能需要回溯或动态规划才能得到正确答案。在C#中,可以实现一个贪心函数,按照硬币面额降序遍历,尽可能多地使用大面额的硬币。 以上三个问题展示了C#在...

    动态规划解决找零钱问题

    ### 动态规划解决找零钱问题 #### 知识点概述 本篇文章将通过一个具体的C语言程序来探讨如何运用动态规划解决找零钱问题。找零钱问题是计算机科学和算法领域中的一个经典问题,它涉及到寻找用最少数量的硬币凑成...

    最少硬币找零算法

    本算法通过动态规划的方式解决最少硬币找零问题,不仅确保了算法的时间效率,还提供了最优解。 #### 问题描述 假设我们有 _n_ 种不同面值的硬币,每种硬币的面值分别存储在数组 _T_[1:_n_] 中。现在我们需要使用...

Global site tag (gtag.js) - Google Analytics