演算法學習——貪心演算法之幣種統計
阿新 • • 發佈:2018-12-17
演算法描述
幣種統計
單位給每一位員工發工資(精確到元),為了保證不臨時換零錢,使得每個員工取款的張數最少,在取工資前統計所有員工所需要的各種票面的張數(約定票種為100,50,20,10,5,2,1元),並驗證幣種統計是否正確
演算法思路
演算法描述其實是省略了要求,使用者肯定是要輸入員工數以及各位員工的工資
定義:
n位員工,G[n]對應了第n員工的工資
a陣列存放100元到1元的面值,a[0]=100,a[1]=50...
b陣列對應每個面值的張數,b[0]對應100元的張數,b[1]對應50元的張數...
採用貪心策略,每次取最大面值
演算法實現
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("該演算法正確!"); }