亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java動(dòng)態(tài)規(guī)劃算法——硬幣找零問(wèn)題實(shí)例分析

 更新時(shí)間:2020年05月26日 09:59:47   作者:Z_DZ  
這篇文章主要介紹了java動(dòng)態(tài)規(guī)劃算法——硬幣找零問(wèn)題,結(jié)合實(shí)例形式分析了java動(dòng)態(tài)規(guī)劃算法——硬幣找零問(wèn)題相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了java動(dòng)態(tài)規(guī)劃算法——硬幣找零問(wèn)題。分享給大家供大家參考,具體如下:

問(wèn)題描述

現(xiàn)在有3種硬幣分別為:1元,5元,10元,現(xiàn)在給你63元,讓你全部換成硬幣,求出最小硬幣數(shù)量,也就是說(shuō),怎么用最少的硬幣數(shù)湊成63元。

分析問(wèn)題

解決這個(gè)問(wèn)題,我們可以將這個(gè)大問(wèn)題分成若干個(gè)小問(wèn)題,自下而上解決問(wèn)題。

1元對(duì)應(yīng)的最小硬幣數(shù)是1

2元對(duì)應(yīng)的最小硬幣數(shù)是2

3元對(duì)應(yīng)的最小硬幣數(shù)是3

4元對(duì)應(yīng)的最小硬幣數(shù)是4

……

63元對(duì)應(yīng)的最小硬幣數(shù)是XXX

假設(shè)我們將前邊計(jì)算出的金額對(duì)應(yīng)的最小硬幣數(shù)像備忘錄一樣記錄下來(lái),那么后邊金額對(duì)應(yīng)的最小硬幣數(shù)的就好說(shuō)了,為什么?

舉例:假設(shè)你要求63的最小硬幣數(shù),那么你需要這樣計(jì)算:63-1=62、63-5=58、63-10=53。假設(shè)62、58、53對(duì)應(yīng)的最小硬幣數(shù)已經(jīng)被你記錄在了備忘錄數(shù)組。這時(shí)候你只需要找出62、58、53中誰(shuí)對(duì)應(yīng)的最小硬幣數(shù)最小,然后加1,就是63對(duì)應(yīng)的最小硬幣數(shù)。因?yàn)?3比62、58、53都大,最好的情況無(wú)非就是在62、58、53中找出最小的一種情況加1,這就是最優(yōu)解!

按照這種備忘錄思想,我們進(jìn)行編程。首先將我們要處理的數(shù)據(jù)轉(zhuǎn)換成數(shù)組和必要參數(shù)。

int[] coins = { 1 , 5 , 10 }; //硬幣面額數(shù)組
int adm = 63; //要求的金額
int[] money = new int[63+1]; //金額數(shù)組,也就是備忘錄數(shù)組

說(shuō)明:money數(shù)組就是備忘錄數(shù)組,例如:money[0]對(duì)應(yīng)0,money[1]對(duì)應(yīng)1,money[2]對(duì)應(yīng)2……

接下來(lái),將我們上邊的解題思路抽象成函數(shù),函數(shù)中無(wú)非就是:循環(huán),判斷,賦值……如何利用這些邏輯語(yǔ)句,將我們的思路描述出來(lái),這是最難的,因?yàn)橐龅降嗡宦?,情況都要考慮周全,一步錯(cuò)結(jié)果就錯(cuò),這需要長(zhǎng)久鍛煉抽象邏輯思維。我比較習(xí)慣的方式是邊看代碼,邊關(guān)聯(lián)結(jié)題思路,然后模仿,代碼中有注釋?zhuān)蠹疫吙催叿治霭桑?/p>

public static void main(String[] args) {
 
 int[] coins = {1,5,10};
 int money = 63;
 
 changeMoney(coins,money);
}
 
/**
 * 硬幣找零算法,備忘錄方法
 * @param coins 硬幣面額數(shù)組 
 * @param money 目標(biāo)金額
 */
public static void changeMoney( int[] coins , int money ) {
 //備忘錄數(shù)組,一一對(duì)應(yīng)
 int[] memo = new int[money + 1];
 //0元對(duì)應(yīng)的最小硬幣數(shù)是0
 memo[0] = 0;
 
 System.out.println( "金額\t" + "對(duì)應(yīng)的最小硬幣數(shù)" );
 //遍歷備忘錄數(shù)組,為每個(gè)金額記錄他的最小硬幣數(shù),我們從1元開(kāi)始
 for( int currentMoney = 1 ; currentMoney <= money ; currentMoney++ ) {
 //默認(rèn)最小硬幣數(shù)就是當(dāng)前金額的本身
 //舉例:63元最多就是63個(gè)1元的硬幣唄
 int minCoins = currentMoney;
 //遍歷硬幣面額數(shù)組,找到前邊所能找到的最小硬幣數(shù)加1
 for( int coinKind = 0 ; coinKind < coins.length ; coinKind++ ) {
 //只有當(dāng)前金額大于等于某個(gè)硬幣面額的時(shí)候才可以用這種方法
      //舉例:5-1=4,5-5=0,5-10=-5,我們沒(méi)有-5元好吧……
 if( currentMoney >= coins[coinKind] ) {
 //我們?cè)趥渫浿胁檎抑暗慕痤~對(duì)應(yīng)的最小硬幣數(shù)
 //如果能查到就在它的基礎(chǔ)上加1
 int tempCoins = memo[currentMoney - coins[coinKind]] + 1;
 //找到幾種情況中最小的硬幣數(shù)
 //舉例:63元 tempConis 
 //可以是memo[63-1]+1、memo[63-5]+1、memo[63-10]+1
 //我們要找到最小的
 if( tempCoins < minCoins ) {
  minCoins = tempCoins;
 }
 }
 }
 //找到當(dāng)前金額對(duì)應(yīng)的最小硬幣數(shù),我們將它記錄在備忘錄中
 memo[currentMoney] = minCoins;
 
 System.out.println( currentMoney + "\t" + memo[currentMoney] );
 }
}

運(yùn)行結(jié)果

金額        對(duì)應(yīng)的最小硬幣數(shù)
1        1
2        2
3        3
4        4
5        1
6        2
7        3
8        4
9        5
10        1
11        2
12        3
13        4
14        5
15        2
16        3
17        4
18        5
19        6
20        2
21        3
22        4
23        5
24        6
25        3
26        4
27        5
28        6
29        7
30        3
31        4
32        5
33        6
34        7
35        4
36        5
37        6
38        7
39        8
40        4
41        5
42        6
43        7
44        8
45        5
46        6
47        7
48        8
49        9
50        5
51        6
52        7
53        8
54        9
55        6
56        7
57        8
58        9
59        10
60        6
61        7
62        8
63        9

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名

    MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名

    這篇文章主要介紹了MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java.lang.Runtime.exec() Payload知識(shí)點(diǎn)詳解

    java.lang.Runtime.exec() Payload知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java.lang.Runtime.exec() Payload知識(shí)點(diǎn)相關(guān)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2020-03-03
  • Java線程通信及線程虛假喚醒知識(shí)總結(jié)

    Java線程通信及線程虛假喚醒知識(shí)總結(jié)

    今天給大家?guī)?lái)的是關(guān)于Java線程的相關(guān)知識(shí),文章圍繞著Java線程通信及線程虛假喚醒的知識(shí)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java并發(fā) CompletableFuture異步編程的實(shí)現(xiàn)

    Java并發(fā) CompletableFuture異步編程的實(shí)現(xiàn)

    這篇文章主要介紹了Java并發(fā) CompletableFuture異步編程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • SpringAop實(shí)現(xiàn)原理及代理模式詳解

    SpringAop實(shí)現(xiàn)原理及代理模式詳解

    Spring的AOP就是通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)的,使用了兩個(gè)動(dòng)態(tài)代理,分別是JDK的動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理,本文重點(diǎn)給大家介紹下SpringAop實(shí)現(xiàn)原理及代理模式,感興趣的朋友一起看看吧
    2022-04-04
  • Netty框架實(shí)現(xiàn)TCP/IP通信的完美過(guò)程

    Netty框架實(shí)現(xiàn)TCP/IP通信的完美過(guò)程

    這篇文章主要介紹了Netty框架實(shí)現(xiàn)TCP/IP通信,這里使用的是Springboot+Netty框架,使用maven搭建項(xiàng)目,需要的朋友可以參考下
    2021-07-07
  • 23種設(shè)計(jì)模式(7) java代理模式

    23種設(shè)計(jì)模式(7) java代理模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java代理模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java格式化時(shí)間示例

    java格式化時(shí)間示例

    這篇文章主要介紹了java格式化時(shí)間示例,需要的朋友可以參考下
    2014-04-04
  • NIO深入理解FileChannel使用方法原理

    NIO深入理解FileChannel使用方法原理

    這篇文章主要為大家介紹了NIO深入理解FileChannel的源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論