关注
/* 硬币题的解法,贪心算法,能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;
}
}
}
}
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
03-30 19:56
门头沟学院 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 26届春招投递记录 #
32710次浏览 254人参与
# 妈妈治愈了你哪些脆皮时刻 #
47519次浏览 360人参与
# 27届实习投递记录 #
114786次浏览 1256人参与
# 我的工作日记 #
207976次浏览 1829人参与
# 我的求职总结 #
512676次浏览 7094人参与
# 你投了多少家公司?进展是___ #
248233次浏览 1449人参与
# 大学生该如何认清当下的就业环境? #
178835次浏览 943人参与
# AI面会问哪些问题? #
134595次浏览 3468人参与
# 要毕业了,再不说就来不及了 #
6373次浏览 111人参与
# 我与AI的日常 #
10804次浏览 202人参与
# 27届求职交流 #
500383次浏览 4665人参与
# 如果公司降薪,你会跳槽吗? #
168848次浏览 972人参与
# 今年秋招还有金九银十吗 #
85136次浏览 518人参与
# 25届非技术实习投递记录 #
159435次浏览 1027人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
168789次浏览 916人参与
# 应届生应该先就业还是先择业 #
202353次浏览 945人参与
# 快手求职进展汇总 #
775723次浏览 7155人参与
# 你以为的实习VS真实的实习 #
144217次浏览 760人参与
# 你觉得什么岗位会被AI替代 #
65415次浏览 386人参与
# 你的秋招进行到哪一步了 #
2803171次浏览 23414人参与
神州信息成长空间 151人发布