→ SansWord:這只是換出等價零錢嗎?還是也有個數最少? 04/27 13:39
→ markmcm:每個幣值都是大的幣值的因數所以用greedy也會是最小值吧 04/27 15:00
推 SansWord:不對喔,換零錢問題不是greedy 05/02 12:01
→ SansWord:假設今天有5,4,2,1 四種幣值,要換8元,用Greedy會錯 05/02 12:01
→ SansWord:喔對,markmcm您說的是對的。 05/02 12:02
做了個用動態規劃的函數,現在用 5,4,2,1 來換 8 就沒問題了
amounts = ARGV.map(&:to_i)
$denominations = [5,4,2,1]
def change(amount)
min_number = [0] #min coin count for [index] amount
min_first_element = [] #first element of min coin set for [index] amount
for p in 1..amount
min_coin = amount #amount is the max coins changes
coin = nil
$denominations.find_all{|i| i<=p}.each{|denomination|
if (1+min_number[p-denomination]) <= min_coin
min_coin = 1+min_number[p-denomination]
coin = denomination
end
}
min_number[p] = min_coin
min_first_element[p] = coin
end
a = amount
for i in 1..min_number[amount]
printf("%4d,",min_first_element[a])
a -= min_first_element[a]
end
end
※ 編輯: markmcm 來自: 163.29.185.99 (05/05 16:16)