贪婪算法_找零钱问题_学习记录

65 篇文章 0 订阅

贪婪算法_找零钱问题_学习记录

package p33;

import java.util.Scanner;

/**
 * 贪婪算法-解决找零钱问题
 * @author Guozhu Zhu
 * @date 2018/8/30
 * @version 1.0
 *
 */
public class Test10 {
	
	public static int max = 10;
	
	public static int[] value = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10};
	
	public static int[] num = new int[max];
	
	/*========== Test ==========*/
	public static void main(String[] args) {
		System.out.println("输入零钱:");
		Scanner in = new Scanner(System.in);
		double n = in.nextDouble();
		exchange(n*100);
		for (int i = 0; i < num.length; i++) {
			if (num[i] > 0) {
				System.out.println("面值:" + value[i] / 100.0 + "张数:" + num[i]);
			}
		}
	}
	
	public static void exchange(double n) {
		int i;
		for (i = 0; i < value.length; i++) {
			if (n > value[i]) {
				break;
			}
		}
		while (n > 0 && i < value.length) {
			if (n >= value[i]) {
				n -= value[i];
				num[i]++;
			} else if (n < 10 && n >= 5) {
				num[value.length-1]++;
				break;
			} else {
				i++;
			}
		}
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪婪算法是一种基于贪心策略的算法,它在每一步都选择当前看起来最优的选项,以期望最终得到全局最优解。找零钱问题是一个经典的使用贪婪算法解决的问题。 假设你需要找零 $n$ 元钱,你手里有若干种面值的硬币,如 1 元、5 元、10 元、20 元、50 元、100 元等。现在要求尽可能少地使用硬币找零,该怎么办? 一个简单而有效的贪婪策略是每次选取面值最大的硬币进行找零。在找零过程中,每次都用尽可能多的面值最大的硬币,直到找完为止。这个方法的正确性可以通过反证法证明。 下面是一个 Python 实现: ```python def change(n, coins): """ 在硬币列表 coins 中找零 n 元钱,返回所需的硬币数量。 """ coins.sort(reverse=True) # 按面值从大到小排序 count = 0 for coin in coins: while n >= coin: n -= coin count += 1 return count ``` 这个函数接受两个参数:要找零的金额 $n$ 和硬币列表 coins。它首先按硬币面值从大到小排序,然后从大到小遍历硬币列表,每次用尽可能多的当前面值的硬币进行找零,直到零钱全部找完为止。 例如,如果要找零 63 元,可用的硬币面值分别为 1 元、5 元、10 元、20 元和 50 元,可以这样调用该函数: ```python coins = [1, 5, 10, 20, 50] n = 63 count = change(n, coins) print(count) # 输出 5 ``` 这个例子中,找零 63 元需要 5 个硬币,分别是 50 元、10 元、1 元、1 元、1 元。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值