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

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
牛客网
牛客企业服务