1. 程式人生 > >演算法學習——貪心演算法之幣種統計

演算法學習——貪心演算法之幣種統計

演算法描述

幣種統計

單位給每一位員工發工資(精確到元),為了保證不臨時換零錢,使得每個員工取款的張數最少,在取工資前統計所有員工所需要的各種票面的張數(約定票種為100,50,20,10,5,2,1元),並驗證幣種統計是否正確

演算法思路

  1. 演算法描述其實是省略了要求,使用者肯定是要輸入員工數以及各位員工的工資

    定義:n位員工,G[n]對應了第n員工的工資

  2. a陣列存放100元到1元的面值,a[0]=100,a[1]=50...

  3. b陣列對應每個面值的張數,b[0]對應100元的張數,b[1]對應50元的張數...

  4. 採用貪心策略,每次取最大面值

演算法實現

    System.out.println("輸入員工數n:");
    Scanner scanner = new Scanner(System.in);
    int n=scanner.nextInt();
    
    System.out.println("依次輸入員工的工資");
    int[] G = new int[n];
    for(int i=0;i<n;i++){
        G[i]=scanner.nextInt();
    }
    scanner.close();

    int sumG = 0;//計算全體員工工資總和,便於之後的驗證
    int sum = 0;
    for(int i=0;i<G.length;i++){
        sumG = sumG + G[i];
    }
    
    int[] a = {100,50,20,10,5,2,1};//7個面值不同幣種
    int[] b = new int[7];//存放個面值對應的張數
    boolean flag = true;
    
    for(int i=0;i<G.length;i++){
        for(int j=0;j<a.length;j++){
            while(G[i]>=a[j]){//每次取最大面值
                G[i]=G[i]-a[j];
                b[j]++;//當前面值對應的張數+1
            }
        }
    }
    //顯示各面值對應需要的張數
    for(int i=0;i<b.length;i++){
        System.out.println("需要"+b[i]+"張面值為"+a[i]+"元的紙幣");
        sum = sum+b[i]*a[i];
    }
    
    //驗證,各個面值與其對應的張數想乘的總和等於全部員工工資的總和,則說明演算法正確
    if(sumG==sum){
        System.out.println("該演算法正確!");
    }

結果