1. 程式人生 > 其它 >【貪心】發工資——貪心演算法入門題目

【貪心】發工資——貪心演算法入門題目

技術標籤:五大常用演算法貪心演算法

原題連結

問題描述

作為程式猿,最盼望的日子就是每月的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(); } } }

提交結果