设有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;
}
问题描述 小Q手上有 n 种不同面值的硬币,每种硬币有无限多个。为了方便购物,他希望带尽量 少的硬币,但是要能组合出1到 m 之间的任意值。输入的第一行为两个整数:m 和 n,他们的意义如题目描述。 接下来的 n 行,每行一个整数,第i+1 行的整数表示第 i 种硬币的面值。输出的最少需要携带的硬币数量,如果无解则输出-1。 50%的数据:1<=n<=10, 1<=m<=1...
问题描述 有1元,5元,10元,50元,100元,500元的硬币 现要用这些面额的硬币支付A元,最大需要多少枚硬币 本题假设至少有一种方案 输入: 第一行输入六个数字,分别代表六种面值硬币的数量 第二行输入一个整数A,代表需要支付的金额 样例输入 3 2 1 3 0 2 620 样例输出 6 思路 贪心算法即遵循某种规律,(贪心地)选择当前最有的解,最终找到最优解 此题使用贪心算法,即每次都选择面...
题目描述 小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。 比如,可能情形是:oo*oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 我们约定:把翻动相...
描述 有1元,5元,10元,50元,100元,500元的硬币各C1 , C5 , C10 , C50 , C100 , C500 枚。现在要用这些硬币来支付A 元,最少需要多少枚硬币?假设本题至少存在一种支付方案。 限制条件 0<=C1 , C5 , C10 , C50 , C100 , C500<=100000000000 0<=A<=1000000000000 样例: ...
...
贪心算法之找硬币问题 题目: 假设有面值为5元、2元、1元、5角、2角、1角(折半查找排序)的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少,如何付款? 贪心算法的思想: 只根据当前的信息就做出选择,不是从全局最优来考虑,而是考虑局部最优。 输入:4.6 输出:3 为什么输出不为4? 因为double类型,最后一次比较时0.1和0.1无法比较,所以输出为3....
要求:给定面额为1,5,10,50,100,500这六种面额的硬币,各3,2,1,3,0,2枚,现在用这些硬币支付A元,求使用最少的硬币。 先上代码: 优先使用最大面额的硬币才能使硬币数最少。 但是,刚才我讨论到一个问题:如果A=100,面值为80,70,30,10,10,假设数量都是无限。 那上面的代码就是错的 ?。因为优先使用最大面额,80,10,10,而恰恰最少的硬币是70,30。 这里就涉...
题目描述 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。 输入 两个正整数,表示每...
2-sat总结 2-sat问题,一般表现的形式为。每一个点有两种方式a,b,要么选a,要么选b。而且点点之间有一些约束关系。比如:u和v至少一个选a。那么这就是一个表达式。把a当成真,b当成假,那就是u真或v真。2-sat的题目就是这样。给定这些约束,推断是否会矛盾 注意表达式的转化形式,(事实上就是离散数学中那几种转换方式) 比方(u真且v真)或(u假且v假)就能够转化成(u真或v假)且(u假或...
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 样例:如:[[84,250],[0,0],[1,0],[0,-70],[0,-70],[1,-1],[21,10],[42,90],[-42,-230]] 思路:一条直线有斜率和截...