设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元。现要用这些面值的硬币来购物。在购物中希望使用最少个数硬币。例如,1 次购物需要付款0.55 元,如果没有5 角的硬币,只好用2*2角+1*1角+1*5分 共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
思路:1)先考虑最大币值下手
2)最后的输出范围小于等于最小币值
#include<iostream>
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<=a[0]) {//小于最小单位5分
cout << num << endl;
}
else {
cout << "impossible" << endl;
}
}
return 0;
}