关注
/* 硬币题的解法,贪心算法,能AC,主要思路是统计当前硬币面值的总和sum,
* 然后从硬币数组里选取面值不小于sum+1的最大面值硬币加入,直到sum达到m;
* 之所以可以这样,我们借助测试用例{1,2,5,10}理解,
* 首先要凑出1,那么必选1,即{1},选取面值不小于2的最大的2加入,即{1,2},这时可凑出1,2,3;
* 现在sum为3,要选取不小于4的最大的加入,所以还是选2,即{1,2,2},这时可凑出1,2,3,4,5;
* 现在sum为5,要选取不小于6的最大的加入,所以选5,即{1,2,2,5},这时可凑出1~10;
* 现在sum为10,要选取不小于11的最大的加入,所以选10,即{1,2,2,5,10},这时可凑出1~20;
* 此时sum达到20,循环停止。
* 通过以上可以分析出,假设目前我已有的硬币能凑出1~p范围内的所有数,
* 我们只需添加一个q,即可凑出1~(p+q)范围内的所有数。
*/
import java.util.*;
public class Exam1{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[] coin = new int[n];
//输入硬币数组;
for (int i = 0; i < n; i++) {
coin[i] = in.nextInt();
}
System.out.println(minNum(m,n,coin));
}
public static int minNum(int m, int n, int[] arr) {
//先把硬币数组排序,便于之后选出需要的最大的数;
Arrays.sort(arr);
//必须要有1,不然没法凑出1;
if(arr[0] != 1){
return -1;
}
int sum = 0;
int result = 0;
while(true){
//总面值达到m即停止;
if(sum >= m){
return result;
}
//依次从arr数组里选出符合要求的最大的数加入;
for(int i=n-1; i>=0; i--){
if(arr[i] <= sum+1){
//添加一枚硬币;
sum += arr[i];
result++;
break;
}
}
}
}
}
查看原帖
点赞 评论
相关推荐

点赞 评论 收藏
分享
07-13 10:24
广州南方学院 运营 
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 26届的你们有几段实习? #
16229次浏览 244人参与
# 你小时候最想从事什么职业 #
102458次浏览 1771人参与
# 你被哪些公司秒挂过? #
17014次浏览 173人参与
# 网申一定要掌握的小技巧 #
9462次浏览 65人参与
# 如何提高实习转正率? #
7118次浏览 132人参与
# 新凯来求职进展汇总 #
40911次浏览 108人参与
# 你认为哪些项目算烂大街? #
7486次浏览 181人参与
# 机械校招之路总结 #
92236次浏览 1889人参与
# 你后悔自己读研吗? #
7956次浏览 169人参与
# 你以为的实习VS真实的实习 #
10023次浏览 121人参与
# 腾讯工作体验 #
479669次浏览 3498人参与
# 月薪多少能在一线城市生存 #
9305次浏览 159人参与
# 最难的技术面是哪家公司? #
5465次浏览 55人参与
# 找工作时的取与舍 #
81146次浏览 577人参与
# 秋招拿一个offer可以躺平吗 #
144644次浏览 928人参与
# 安利/避雷我的专业 #
77507次浏览 526人参与
# 面试等了一周没回复,还有戏吗 #
137044次浏览 1229人参与
# 你想留在一线还是回老家? #
49846次浏览 513人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
114605次浏览 796人参与
# 选择和努力,哪个更重要? #
85902次浏览 745人参与