算法描述
幣種統計
單位給每一位員工發工資(精確到元),為了保證不臨時換零錢,使得每個員工取款的張數最少,在取工資前統計所有員工所需要的各種票面的張數(約定票種為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("該算法正確!");
}