目录
问题描述:
现有1分、2分、5分、10分、50分和100分的硬币各若干枚,现在要用这些硬币来支付W元,请设计一个贪心算法,尽可能用较少的硬币数量完成支付行为。现有1分、2分、5分、10分、50分和100分的硬币各若干枚,现在要用这些硬币来支付W元,请设计一个贪心算法,尽可能用较少的硬币数量完成支付行为。
算法设计思路:
设计一个for循环,用来执行操作,循环次数其实与张数挂钩。设置条件,如果ww>arr[i](目前所能接受最大面额),就不执行i--,说不定这个面额还能减一次。如果不能减了,就执行i--,让下一个小一级的面额试试看,以此类推。最后,如果ww=0,就可以输出结果。
代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
double w = sc.nextDouble();
int ww = (int)(w*100);//把元单位转换为分
int arr[] = new int[6];
for (int i = 0; i < 6; i++) {//输入硬币的几种面额
int a = sc.nextInt();
arr[i] = a;
}
// Arrays.sort(arr);//若是乱序,则需要排序
int num = 0;//存储使用张数
for (int i = 5; i >= 0;) {//因为排序默认从小到大,所以这里要从后往前
if (ww >= arr[i]) {
ww = ww - arr[i];
// i++;
num++;//每使用一张,加1
} else {
i--;//把i--安排在这里,上面只要最大的面额还能用,就不减;不能用了,就执行i--
}
if (ww == 0) {
System.out.println(num);//输出张数
break;
}
}
}
}
}
算法运行结果及计算时间复杂度分析:
如果需要排序,则时间复杂度为T(n)=O(nlogn)
如果不需要排序,则时间复杂度为T(n)=O(n)