數學基礎 三 動態規劃2(求解湊齊錢的最小張數)

2021-10-01 09:32:59 字數 1306 閱讀 5041

湊齊錢的最小張數概念:

比如只有2塊、3塊和5塊錢若干,問湊齊100塊錢最小需要幾張錢能湊齊?(20張5塊的,所以是20張)

前面一篇求解編輯距離時,有現成的狀態轉移方程,可是這種湊齊面值的沒有現成的公式,只能自己去推導。

當然我們可以利用求餘數求解,湊齊98塊,需要98/5=19…3,所以為19張5塊+1張3塊(一共20張)

但這個可能用餘數可能更方便,但對於動態歸劃方法,可能是個思路

比如只有2、3、7塊,用**推導的過程如下:

而如果只有2、5、9塊,它的推導如下:

根據推導過程,寫出的演算法如下:

public class lesson10_1 ;

// 如果不加變數儲存,每次都要重複遞迴計算

private static maphascount = new hashmap<>();

// 傳入總金額和可選幣種,返回湊夠該金額的最小數量,返回null表示沒有找到

// 為null表示湊不齊這個錢(商場買菜要1塊錢,可選幣種最小值要2塊,我們不能傻得給人家2塊不找零,此時就是湊不齊)

public static integer getcount(int total, int coins)

// 遞迴減到了負數,也沒湊齊,就是沒找到

if (total < 0) else if (total == 0) else

// 去除空值

listresultlist = arrays.stream(min).filter(e -> e != null).collect(collectors.tolist());

// 如果不為空,那最小值就是所需的最小個數

integer result = resultlist.size() > 0 ? resultlist.stream().maptoint(e -> e).min().getasint() : null;

// 放到map中,防止後續重複遞迴計算

hascount.put(total, result);

return result;}}

public static void main(string args)

}

動態規劃基礎題2

演示 c 問題描述 給定乙個字串,求最少切幾次,可以都切成回文串 例如 對於字串 abaacca 最少切割一次,就可以得到 aba 和 acca 這兩個回文子串 輸入 輸入的第一行是乙個整數 t t 20 表示一共有 t 組資料。接下來的 t 行,每一行都包含了乙個長度不超過的 1000 的字串,且...

動態規劃系列(2) 找零錢問題

refer tom在自動售貨機上買了一瓶飲料,售價37美分,他投入了1美元 1美元 100美分 現在自動售貨機需要找錢給他。售貨機中現在只有四種面額的硬幣 1美分 5美分 10美分 25美分,每種硬幣的數量充足。現在要求使用最少數量的硬幣,給tom找錢,求出這個最少數量是多少。自動售賣機需要給tom...

強化學習(三)用動態規劃(DP)求解

在強化學習 二 馬爾科夫決策過程 mdp 中,我們討論了用馬爾科夫假設來簡化強化學習模型的複雜度,這一篇我們在馬爾科夫假設和貝爾曼方程的基礎上討論使用動態規劃 dynamic programming,dp 來求解強化學習的問題。動態規劃這一篇對應sutton書的第四章和ucl強化學習課程的第三講。對...