/* 硬币题的解法,贪心算法,能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;                 }             }         }     } }
点赞 评论

相关推荐

来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
刷到其他牛友的面经,这是什么面试题&nbsp;咋还问这个
爱睡觉的冰箱哥:问出这种问题的公司有人去的是这个
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务