【貪心】發工資——貪心演算法入門題目
阿新 • • 發佈:2020-12-27
問題描述
作為程式猿,最盼望的日子就是每月的9號了,因為這一天是發工資的日子,養家餬口就靠它了,呵呵
但是對於公司財務處的工作人員來說,這一天則是a很忙碌的一天,財務處的小李最近就在考慮一個問題:如果每個員工的工資額都知道,最少需要準備多少張人民幣,才能在給每位員工發工資的時候都不用員工找零呢?
這裡假設程式猿的工資都是正整數,單位元,人民幣一共有100元、50元、10元、5元、2元和1元六種。
輸入
輸入資料包含多個測試例項,每個測試例項的第一個數是一個整數n(n<100),表示員工的人數,然後是n個員工的工資。n=0表示輸入的結束,不做處理。
輸出
對於每個測試例項輸出一個整數x,表示至少需要準備的人民幣張數。每個輸出佔一行。
解法
思路
(1) 求最少需要多少張,也就是面值最大的儘可能用的多,所需的總數才越少
(2) 先用最大面值的錢來填數,再用次小的面值來填數,比如360的工資,先發三個一百的,剩餘60,先發一個50,最後剩餘10,發一個10塊,總共5張
(3) 外層迴圈控制,將每組的都計算出來
程式碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 人數
int n = scanner.nextInt();
int[] money = new int[] {100, 50, 10, 5, 2, 1};
// 有多個組,直到輸入0停止
while (n != 0){
// 至少需要count張錢
int count = 0;
// 計算每個人至少需要多少張
for (int i = 0; i < n; i++) {
int salary = scanner.nextInt();
// 先用最大面值的錢, 直到剩餘沒發的工資小於當前面值
for (int j = 0; j < 6; j++) {
if (salary >= money[j]) {
// 當前面值的錢需要發多少張
int num = salary / money[j];
count += num;
salary -= num * money[j];
}
}
}
System.out.println(count);
n = scanner.nextInt();
}
}
}