深入淺出算法題-零錢兌換的動(dòng)態(tài)規(guī)劃問題
一、 零錢兌換:硬幣的最少個(gè)數(shù)
給一個(gè)整數(shù)數(shù)組 coins ,表示不同面額的硬幣;以及一個(gè)整數(shù) amount ,表示總金額。
計(jì)算并返回可以湊成總金額所需的最少硬幣個(gè)數(shù) 。如果沒有任何一種硬幣組合能組成總金額,返回-1 。
可認(rèn)為每種硬幣的數(shù)量是無限的。

解題關(guān)鍵點(diǎn)
經(jīng)典的動(dòng)態(tài)規(guī)劃問題。
設(shè)置一個(gè)數(shù)組dp,其中每個(gè)元素dp[i]記錄的是,當(dāng)金額為i時(shí),所需要的硬幣個(gè)數(shù)。則題目所求為dp[amount]。
考慮基礎(chǔ)簡單的例子。有dp[0] = 0,也就是說,金額為0所需的硬幣個(gè)數(shù)是0。
考慮狀態(tài)轉(zhuǎn)移公式。從小到大遍歷金額數(shù),這樣,可以保證:當(dāng)我們計(jì)算金額i所需的最少硬幣個(gè)數(shù)dp[i]時(shí),前面更少的金額所需要的最少硬幣個(gè)數(shù),比如dp[i-1]、dp[i-2]······等都已求出。
那么,對任意的dp[i],面對某種硬幣的面額(記為coin),如果在湊成金額i時(shí)選擇了這枚硬幣,那么在湊成金額(i-coin)時(shí)所需要的硬幣個(gè)數(shù) + 1即可。也就是dp[i] = dp[i-coin] + 1。
class?Solution(object):
????def?coinChange(self,?coins,?amount):
????????"""
????????:type?coins:?List[int]
????????:type?amount:?int
????????:rtype:?int
????????"""
????????#?初始化為正無窮大
????????dp?=?[float('inf')]*(amount+1)
????
????????#?金額為0,所要湊的硬幣個(gè)數(shù)也為0
????????dp[0]?=?0
????????
????????for?coin?in?coins:
????????????sum_coin?=?coin
????????????
????????????while?sum_coin?(amount+1):
????????????????dp[sum_coin]?=?min(dp[sum_coin],?dp[sum_coin-coin]+1)
????????????????sum_coin?+=?1
????????
????????#?print(dp)
????????return?dp[amount]?if?dp[amount]!=?float('inf')?else?-1
二、零錢兌換:硬幣的組合總數(shù)
給一個(gè)整數(shù)數(shù)組 coins 表示不同面額的硬幣,另給一個(gè)整數(shù) amount 表示總金額。
計(jì)算并返回可以湊成總金額的硬幣組合數(shù)。如果任何硬幣組合都無法湊出總金額,返回 0 。
假設(shè)每一種面額的硬幣有無限個(gè)。

解題關(guān)鍵點(diǎn)
經(jīng)典的動(dòng)態(tài)規(guī)劃問題。
設(shè)置一個(gè)數(shù)組dp,其中每個(gè)元素dp[i]記錄的是,當(dāng)湊成金額為i時(shí),所有的硬幣組合的總數(shù)。則題目所求為dp[amount]。
考慮基礎(chǔ)簡單的例子。有dp[0] = 1,也就是說,金額為0時(shí),只有1種選擇,就是什么硬幣都不取。
考慮狀態(tài)轉(zhuǎn)移公式。從小到大遍歷金額數(shù),這樣,可以保證:當(dāng)我們計(jì)算金額i的硬幣組合數(shù)dp[i]時(shí),前面更少的金額的組合數(shù)比如dp[i-1]、dp[i-2]······等都已求出。
那么,對任意的dp[i],面對某種硬幣的面額(記為coin),如果在湊成金額i時(shí)選擇了這枚硬幣,那么它也包含了湊成金額(i-coin)時(shí)的組合個(gè)數(shù)。而對不同面值的硬幣coin,都需要累加所有的組合個(gè)數(shù)。
class?Solution(object):
????def?change(self,?amount,?coins):
????????"""
????????:type?amount:?int
????????:type?coins:?List[int]
????????:rtype:?int
????????"""
????????dp?=?[0]*(amount+1)
????????dp[0]?=?1
????????for?coin?in?coins:
????????????sum_coin?=?coin
????????????
????????????while?sum_coin?<=?amount:
????????????????dp[sum_coin]?+=?dp[sum_coin-coin]
????????????????sum_coin?+=?1
????????
????????return?dp[amount]
深入淺出算法題(1)-動(dòng)態(tài)規(guī)劃前n個(gè)數(shù)字二進(jìn)制中1的個(gè)數(shù)
深入淺出算法題(2)-回文子串個(gè)數(shù)之馬拉車算法
(1)GAN改進(jìn)系列 | 最新ICCV2021生成對抗網(wǎng)絡(luò)GAN論文梳理匯總
(2)最新ICCV 2021 | 圖像轉(zhuǎn)換生成對抗GAN匯總梳理
最新 ICCV 2021 | GAN隱私保護(hù)(33)醫(yī)學(xué)圖像(34)生成對抗GAN
【附下載】機(jī)器學(xué)習(xí)統(tǒng)計(jì)學(xué),476頁pdf
【附下載】《面向機(jī)器學(xué)習(xí)的特征工程》.pdf
【附ppt與視頻】可解釋機(jī)器學(xué)習(xí)進(jìn)展,附ppt與視頻
如果覺得有用,就點(diǎn)個(gè)“在看”吧?
