package 换零钱;
/**
* @author naru
* 编写时间: 2021年3月10日
* 类名:零钱问题
* 题目描述:整钱换零钱问题。输入给定的钱数(double型),输出最少的人民币支出形式(int型)数,人民币单位假设有100元、50元、20元、10元、5元、1元、5角、1角、5分、1分。
例如:输入34.12元,输出20元1张、10元1张、1元4张、1角1张、1分2张
请至少测试如下数据:
(1) 输入3.14元
(2) 输入31.41元
(3) 输入314.15元
(4) 输入31415元
(5) 输入10000000元(一千万)
(6) 输入0.01元
测试数据结果:
20元1张,10元1张,1元4张,1角1张,1份2张.
20元0张,10元0张,1元3张,1角1张,1份4张.
20元1张,10元1张,1元1张,1角4张,1份1张.
20元15张,10元1张,1元4张,1角1张,1份5张.
20元1570张,10元1张,1元5张,1角0张,1份0张.
20元500000张,10元0张,1元0张,1角0张,1份0张.
20元0张,10元0张,1元0张,1角0张,1份1张.
*/
public class 零钱问题 {
public static void main(String[] args) {
change(34.12);
change(3.14);
change(31.41);
change(314.15);
change(31415);
change(10000000);
change(0.01);
}
/*
* change方法
* 利用循环来进行筛选从而判断要换成多少张已有人民币
* 首先因为输入类型为double类型而想要进行判断的面值均为int类型
* 为了double类型转成int类型不出现丢失精度的问题
* 我们将输入的double类型的数值乘上*100变成整数
* 即有了mc = money * 100
* 同时将已有的面值也扩大100倍
* 即i10000,i5000,i2000,i1000,i100,i10,i1;
* 然后我们采用贪心算法来进行求解
* 贪心算法即求解局部最优解
* (题外话:贪心算法在这道题上运用可以说是没有任何差错非常完美
* 但是其实有时候在特殊的面值情况下 是会陷入局部最优的错误判断的
* 因此深究下去的话 动态规划方法其实是最有效的解法)
* 以34.12为例子 扩大100倍变为3412
* 3412/2000 可以求解出我们可换成20块的张数
* 3412-(3412/2000)*2000即为剩下的钱数
* 以此类推
* 我们用剩下的钱数以同样的方法求解出可换为10块的张数
* ....
* 最后再使用print输出之前计算出的i2000,i1000等的数值即可
*/
static void change(double money)
{
int i10000,i5000,i2000, i1000, i100, i10, i1;
double mc = money * 100;
double r=mc;
for (i10000 = 0; i10000 <= mc / 2000; i10000++)
{
r = mc - i10000 * 10000 ;
if (r < 10000)
break;
}
for (i5000 = 0; i5000 <= mc / 2000; i5000++)
{
r = r - i5000 * 5000 ;
if (r < 5000)
break;
}
for (i2000 = 0; i2000 <= mc / 2000; i2000++)
{
r =r- i2000 * 2000 ;
if (r < 2000)
break;
}
for (i1000 = 0; i1000 <= mc / 1000; i1000++)
{
r = r- i1000 * 1000;
if (r < 1000)
break;
}
for (i100 = 0; i100 <= mc / 100; i100++)
{
r = r - i100 * 100;
if (r < 100)
break;
}
for (i10 = 0; i10 <= mc / 10; i10++)
{
r = r - i10 * 10;
if (r < 10)
break;
}
for (i1 = 0; i1<= mc / 1; i1++)
{
r = r - i1 * 1;
if (r <= 0)
break;
}
System.out.printf("100元%d张,50元%d张,20元%d张,10元%d张,1元%d张,1角%d张,1份%d张.", i10000,i5000,i2000, i1000, i100, i10, i1);
System.out.println();
}
}
/*运行结果:
100元0张,50元0张,20元1张,10元1张,1元3张,1角0张,1分0张.
100元0张,50元0张,20元0张,10元0张,1元2张,1角1张,1分3张.
100元0张,50元0张,20元1张,10元1张,1元1张,1角3张,1分0张.
100元3张,50元0张,20元0张,10元1张,1元3张,1角0张,1分0张.
100元314张,50元0张,20元0张,10元1张,1元3张,1角0张,1分0张.
100元100000张,50元0张,20元0张,10元0张,1元0张,1角0张,1分0张.
100元0张,50元0张,20元0张,10元0张,1元0张,1角0张,1分1张.
*/
【java】【贪心算法】换零钱问题
最新推荐文章于 2023-02-27 17:28:32 发布