贪婪法找零钱
题目:
思路:
用数组把每个人手上的钱装起来,然后判断能否找开,只要有一个不能找开,即失败。
money[] 来装大妈手中的钱,money[0]代表25元,money[1]代表50元,money[2]代表100元。
14~15行: 接收每个人手上的钱
17~26行: 遍历数组来找零钱,如果当前同学手中是25元即不用判断直接money[0]++;
否则即调用方法判断能否找开。如果找不开就可以直接结束循环输出NO
这个find方法是用来判断当前同学手中的钱能否找开;找钱的策略应该是先从大钱找起。
35~41行:判断能否用50的找开,其实可以不用while,直接用个if就可,因为循环只会做一次。
42~45行:用25元把钱找完。
47行的 if 是用来判断大妈的零钱是否被找完,如果25元或者50元的数量为负数了就说明失败了,无法找开。
49行的switch是把当前找开的钱存起来。
附源码:
在这里插入代码片
import java.util.Scanner;
public class Main {
static int money[];
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int a[] = new int[n];
int i;
money = new int[3];
for (i = 0; i < n; i++)
a[i] = input.nextInt();
for (i = 0; i < n; i++) {
if (a[i] == 25)
money[0]++;
else if (find(a[i]))
;
else {
System.out.println("NO");
break;
}
}
if (i == n)
System.out.println("YES");
}
public static boolean find(int q) {
int s = q - 25;
while (s > 0 && money[1] > 0) {
if (s > 50)
money[1]--;
else
break;
s -= 50;
}
while (s != 0) {
s -= 25;
money[0]--;
}
if (money[0] < 0 || money[1] < 0)
return false;
switch (q) {
case 50:
money[1]++;
break;
case 100:
money[2]++;
break;
}
return true;
}
}