关注
/* 硬币题的解法,贪心算法,能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;
}
}
}
}
}
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 牛客新年AI问运 #
7824次浏览 113人参与
# 你喜欢工作还是上学 #
89386次浏览 883人参与
# 牛客AI体验站 #
16546次浏览 288人参与
# 被AI治愈的瞬间 #
90610次浏览 685人参与
# 你找工作的时候用AI吗? #
173272次浏览 888人参与
# 有必要和同事成为好朋友吗? #
1219次浏览 24人参与
# 听劝,这个公司值得去吗 #
665370次浏览 1996人参与
# 为了秋招你都做了哪些准备? #
32604次浏览 534人参与
# 这个工作能去吗 #
115106次浏览 662人参与
# 多益网络工作体验 #
63264次浏览 306人参与
# 你觉得什么岗位会被AI替代 #
41098次浏览 275人参与
# 秋招吐槽大会 #
304619次浏览 1524人参与
# 工作中的卑微时刻 #
33508次浏览 199人参与
# 央国企投递记录 #
176994次浏览 1655人参与
# 国央企求职进展汇总 #
442543次浏览 3509人参与
# 数字马力求职进展汇总 #
331688次浏览 2381人参与
# 非技术岗薪资爆料 #
490507次浏览 3041人参与
# 我们是不是被“优绩主义”绑架了? #
32865次浏览 487人参与
# 产品面经 #
261260次浏览 2173人参与
# 面试常问题系列 #
275440次浏览 4694人参与
查看3道真题和解析