Java算法---发工资

来源:互联网 发布:java布尔类型的程序 编辑:程序博客网 时间:2024/05/01 15:39
/*对于财务处的工作人员来说,发工资那天是最忙碌的。财务处的NowCoder最近在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位  同事发工资的时候都不用找零呢?  这里假设员工的工资都是正整数,单位元,人民币一共有100元、50元、20元、10元、5元、2元和1元七种。
输入描述:
  输入数据包含多个测试实例,每个测试实例的第一行是一个整数n (n≤100),表示人数,然后是n个员工的工资。
输出描述:
  对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
*/
/* * 本题有两种解法: * 1、贪心: *  其实这道题乍眼一看就是用贪心做的,但是贪心有一个缺陷,就是有时候不能取到最优,但是在本题,用贪心就可以,思路很简单,把给的钱从大到小排序,每次都尽量取最大的即可。代码如下:*/public class Main {public static void main(String[] args) {    Scanner sc=new Scanner(System.in);    int[] mon={100,50,20,10,5,2,1};    while (sc.hasNext()) {        int n=sc.nextInt();        int[] input=new int[n];        int sum=0;        for(int i=0;i<n;i++){            input[i]=sc.nextInt();            int temp=input[i];            for(int j=0;j<mon.length;j++){            sum+=(temp/mon[j]);            temp=temp%mon[j];            if(temp==0){            break;            }            }        }        System.out.println(sum);    }     }}/ *   * 2、动态规划:   其实动态规划是我们经常用的一个思想,也是能保证取到最优解的,如果这道题稍有变动的话,贪心就做不了,只能用动态规划,但是动态规划有一个缺点,用空间换时间,动态打表会浪费很多内存,就本题来说,我最开始用动态规划做,自己再本机运行正确,但是提交上去就提示运行错误(一般是数组越界),为什么会出现这样的问题呢,因为测试用例有边界值,举个例子来说:如果给这样的一个测试用例:31 2 2147483647就会出现java.lang.NegativeArraySizeException这个异常,因为我们要开辟2147483647+1个数组,这样导致了开辟数组的长度(当然也超出了int的范围),超出了JVM的设置,就会报错,当然也可以修改JVM的参数,但是我们只能修改自己本机上的,改不了这个测试程序后台的参数,所以,如果自己运行正确,提交运行错误,应该是这个原因,所以,动态规划虽然是个好办法,但是如果测试数据过大,就会很费内存,有时候会报错,所以我们针对不同的题需要有合适的解法,这个题用贪心的话,就不会存在这个数组越界的问题。下面贴上我自己动态规划的代码,虽然下面代码没有通过测试用例,但是这个想法比较好,可以用的其他题,如果有什么问题,希望大家指出问题。 */public class Main { public static void main(String[] args) {Scanner sc=new Scanner(System.in);int[] mon={1,2,5,10,20,50,100};System.out.println(Integer.MAX_VALUE);while (sc.hasNext()) {int n=sc.nextInt();int[] input=new int[n];int max=0;int sum=0;for(int i=0;i<n;i++){input[i]=sc.nextInt();if(input[i]>max)max=input[i];}int [] dp=new int[max+1];dp[0]=0;        for(int i=0;i<mon.length;i++){        for(int j=mon[i];j<=max;j++){        dp[j]=dp[j-mon[i]]+1;        }        }        for(int i=0;i<n;i++){        sum+=dp[input[i]];        }        System.out.println(sum);}}}
0 0
原创粉丝点击