关注
/* 硬币题的解法,贪心算法,能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-02 08:18
集美大学 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 面试被问到不会的问题,你怎么应对? #
21211次浏览 522人参与
# 学历VS实习,哪个更重要? #
857次浏览 31人参与
# 招商银行数字金融训练营 #
106152次浏览 916人参与
# 你见过哪些招聘隐形歧视? #
21778次浏览 186人参与
# 设计人的面试记录 #
205009次浏览 1630人参与
# 你觉得大几开始实习最合适? #
24632次浏览 245人参与
# 厦门银行科技岗值不值得投 #
15262次浏览 352人参与
# uu们,春招你还来吗? #
59790次浏览 640人参与
# 面试中,你被问过哪些奇葩问题? #
94668次浏览 1178人参与
# 哔哩哔哩笔试 #
34709次浏览 140人参与
# 影石Insta360求职进展汇总 #
183987次浏览 1377人参与
# 国企/银行/研究所公司爆料 #
203379次浏览 913人参与
# 你都用vibe coding做过什么? #
18235次浏览 725人参与
# 供应链/物流校招攻略 #
12400次浏览 218人参与
# 虹软科技求职进展汇总 #
16623次浏览 138人参与
# AI Coding实战技巧 #
13027次浏览 276人参与
# 机械人还在等华为开奖吗? #
325193次浏览 1599人参与
# 做完笔试后你收到面试了吗? #
23941次浏览 210人参与
# 恒生电子笔试 #
19942次浏览 156人参与
# 你现在一天AI几次? #
11087次浏览 118人参与
# Vibe Coding 会干掉初级岗位吗? #
19978次浏览 211人参与
# 如果人生可以debug你会改哪一行? #
9716次浏览 140人参与
查看2道真题和解析