硬币找钱问题(最小硬币和问题)详解与代码实现
?????? 設有6種不同面值的硬幣,各硬幣的面值分別為5分、1角、2角、5角、1元和2元。現在要用這些面值的硬幣來購物和找錢。購物時可以使用的各種面值的硬幣個數存于數組Coins[1:6]中,假設商店里各面值的硬幣有足夠多。對于給定的付款金額,計算使用硬幣個數最少的交易方案。
輸入數據的每一行有6個整數和一個有2位小數的實數,
?????? 分別表示可以使用的各種面值的硬幣個數和付款金額。
輸出為交易所需要的最少硬幣個數,如果不可能完成交易,則輸出“impossible”。
問題解釋:
這里要注意一個點:
此處交易所需的最少硬幣個數為 你支付的硬幣個數 + 商店找給你的硬幣個數。
例如:
一次購物需要支付0.95元,你可以給他的硬幣組合為: 0.5 一個 + 0.2 兩個 + 0.05 一個
????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0.5+0.2+.0.2+0.05=0.95
即 此處使用了四個硬幣完成了交易。但我們發現,如果我們支付 一個 1 元的硬幣,商店找回給我們一個0.05的硬幣,僅需要兩個硬幣便完成的交易。
????????????????????????????????????????????????????????? 1-0.05=0.95
貪心算法:
所謂貪心算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的局部最優解。
貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無后效性。
貪心算法的基本思想:
解決本問題的關鍵在于找到貪心變量,本問題的貪心變量為實際支付金額。由于改變了支付面額的大小,以及商店會找零,就是對于這些硬幣的排列組合。
步驟:
遍歷備選的元素
選擇貪心策略
I中剩余元素不發生變化,
I剩余元素不會變化。
?接下來就是代碼了,請自行觀看:
def contains(a):for i in range(0,6):if (coinvalue[i] == a and coins[i] > 0):return ireturn -1def greed(coinvalue,changvalue,coins,Pay):global coinnumfor i in range(5, -1, -1):#從大到小遍歷if coins[i] > 0:#如果顧客手里有剩余硬幣for j in range(i):#商店的硬幣從小到大遍歷,進行找零realmoney = coinvalue[i] - changvalue[j]#實際上的支付金額=支付硬幣的價值-商店找零的價值if Pay >= realmoney:#只有當實際支付金額效玉目標金額時才進行選取,否則需要增加找零硬幣的金額(即,繼續本層循環 j)if coins[i] >= Pay // realmoney:#如果當前面值硬幣找零后足夠支付余額tempcoinnum = Pay // realmoneycoinnum += tempcoinnum * 2#如果顧客有該硬幣,則無需找零,因為找零會消耗兩個硬幣。if(contains(realmoney) != -1):tempcoinnum = min(tempcoinnum, coins[contains(realmoney)])coinnum -= tempcoinnumcoins[contains(realmoney)] -= tempcoinnumelse:coins[i] -= Pay // realmoneyPay = Pay % realmoneyif (contains(coinvalue[i]) == -1):breakelse:coinnum += coins[i]Pay = Pay - coinvalue[i] * coins[i]coins[i] = 0def outoutresult():if coinnum == 0 or Pay == 0:print("imossible !")else:print("支付和找零需要的最少總硬幣數量:",coinnum)coinnum = 0 coinvalue = [5, 10, 20, 50, 100, 200] changvalue = [0, 5, 10, 20, 50, 100, 200] realmoney = 0 print("請輸入需要支付的金額:") costt = float(input()) Pay = int(costt * 100) coins = [] print("請輸入硬幣個數:") for i in range(0,6):coins.append(int(input())) greed(coinvalue,changvalue,coins ,Pay)outoutresult()?
?
?
總結
以上是生活随笔為你收集整理的硬币找钱问题(最小硬币和问题)详解与代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python discuz_python
- 下一篇: 什么是简单