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


算法描述

幣種統計

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

結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM