【算法】硬币找钱问题(贪心算法)
設有6 種不同面值的硬幣,各硬幣的面值分別為5 分,1 角,2 角,5 角,1 元,2元。現要用這些面值的硬幣來購物。在購物中希望使用最少個數硬幣。例如,1 次購物需要付款0.55 元,如果沒有5 角的硬幣,只好用2x2角+1x1角+1x5分 共4 枚硬幣來付款。
對于給定的各種面值的硬幣個數和付款金額,計算使用硬幣個數最少的交易方案。
輸入格式:
輸入數據有若干組,第一行給出一個整數n表示輸入數據的組數。
以下n行每一行有6 個整數和1個有2 位小數的實數。分別表示可以使用的各種面值的硬幣個數和付款金額。
輸出格式:
輸出每組數據的最少硬幣個數。如果不可能完成交易,則輸出“impossible”。
輸入樣例:
2
2 4 2 2 1 0 0.95
2 4 2 0 1 0 0.55
輸出樣例:
4
4
問題分析
將數字乘以100,方便計算
用數組a【6】={5,10,20,50,100,200},存入錢的面值
b【6】表示每種硬幣的個數
如果要最少的硬幣個數,則從面值最大的開始找錢,當付款金額小于該面值時,i+1,找下一個,每找到一個;總錢數減去該面值,計數加1,b【i】減1;直到錢數等于0;如果減完的金額不小于0,則不可能完成交易,則輸出“impossible”。
注意:因為是double類型,和真實數據存在誤差,所以在判斷最后金額的時候,兩個數無限接近的時候用1e-7來近似看作等于0,只要金額小于等于1e-7,則可以完成交易。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std;int main() {int a[6]={5,10,20,50,100,200};int b[6];int n;cin>>n;//輸入n組數據while(n--){int j;for(j=0;j<6;j++){cin>>b[j];}double money;cin>>money;money=money*100;int num=0;for(j=5;j>=0;j--){if(money>=a[j]&&b[j]>0){money=money-a[j];b[j]--;j++;num++;}}if(money<=1e-7){cout<<num<<endl;}else{cout<<"impossible"<<endl;}}return 0; }總結
以上是生活随笔為你收集整理的【算法】硬币找钱问题(贪心算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全连接神经网络详解(Full Conne
- 下一篇: 英文星期的来历(都是来自神人)