P3847马云(贪心)
来源:互联网 发布:windows找不到某个exe 编辑:程序博客网 时间:2024/06/05 16:53
问题描述
Mr_he 因讨厌马云而彻底放弃网购,他的日常用品都要到商场去购买,而且必须付现金。但是现
金购买,经常会遇到找零的问题,那么现在请你帮助他解决这样一个问题: 现在 Mr_he 手上有 n
种不同面值的硬币,每种硬币有无限多个。为了方便购物,他希望带尽量 少的硬币,但是要能组合出 1 到 m 之间的任意值。
输入格式
第一行为两个整数:m 和 n,他们的意义如题目描述。 接下来的 n 行,每行一个整数,第 i+1 行的整数表示第 i 种硬币的面值
输出格式
最少需要携带的硬币数量,如果无解则输出-1
样例输入
20 4
1
2
5
10
样例输出
5
题解
sum表示目前小于等于sum的种类可以被表示,那么下一次能够增加的面额一定小于等于sum+1,因为如果大于了sum+1那么从sum+1到此之间的值一定不能被满足。
此贪心正确性是显然的。
考场上贪心向应该从小到大贪心,因为如果从大到小贪心不能满足小于此面额时的种类数可行,并且通过之前的值可能表示此时的值。
代码
#include<stdio.h>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<queue>#include<vector>#include<iostream>using namespace std;#define int long long#define maxn 101int n,m;int a[maxn];int cnt[maxn];int ans;int i,j;int sum;main(){ cin>>m>>n; for(i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); if(a[1]==-1){cout<<-1;return 0; } while(sum<m){ for(i=n;i>=1;i--){ if(a[i]<=sum+1){ sum+=a[i]; ans++; break; } } } cout<<ans;}
阅读全文
0 0
- P3847马云(贪心)
- NKOJ 3847 马云 (贪心)
- 贪心(bnuoj49103+二分+贪心)
- 【贪心算法(一)】贪心算法基础
- zoj1002_FireNet(贪心法)
- 贪心题目(SOJ)
- POJ2718(枚举 + 贪心)
- POJ 1328(贪心)
- POJ 1818(贪心)
- POJ 1065(贪心)
- POJ 1477(贪心)
- Monster (贪心)
- 最优装载(贪心)
- 哈夫曼编码(贪心)
- hdu 2570 (贪心)
- uva 11389(贪心)
- poj 2054(贪心)
- Huffman 编码 (贪心)
- c语言位运算符与逻辑运算符的区别
- css通用技巧
- 一位资深程序员大牛给予Java初学者的学习路线建议
- vue框架介绍及语法
- matlab画CDF曲线
- P3847马云(贪心)
- vins-mono slam刚开始接触
- C语言多线程基础-01-线程的创建与销毁
- React Router 使用教程
- 六边形数据结构和寻路
- ceph 重启后osd报错
- HDU 1754 I Hate It (线段树,模板)
- 人人商城v3.1.0 破解在线升级
- HTML