贪心算法

Java实现贪心算法(找零钱问题)

 1 package com.java;
 2 
 3 import java.util.Random;
 4 /**
 5  * 贪心算法
 6  * 贪心算法,又称贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。
 7  * 也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。
 8  *
 9  * 贪心算法的基本思路如下:
10  * 1.建立数学模型来描述问题。
11  * 2.把求解的问题分成若干个子问题。
12  * 3.对每一子问题求解,得到子问题的局部最优解。
13  * 4.把子问题的局部最优解合成原来解问题的一个解。
14  *
15  * 其实现框架如下:
16  * 从问题的某一初始解出发;
17  * while (能朝给定总目标前进一步)
18  * {
19  * 利用可行的决策,求出可行解的一个解元素;
20  * }
21  * 由所有解元素组合成问题的一个可行解。
22  */
23 
24 /**
25  * 钱币找零问题描述:
26  * 假设1元、2元、5元、10元、20元、50元、100元的纸币,分别有c0, c1, c2, c3, c4, c5, c6张。
27  * 现在要用这些钱来支付K元,至少要用多少张纸币?
28  * 用贪心算法的思想:
29  * 每一步尽可能用面值大的纸币,在程序中需要事先将Value按照从小到大的顺序排好。
30  */
31 public class Greed {
32 
33     //人民币面值集合
34     static int[] values = {1, 2, 5, 10, 20, 50, 100};
35     //各种面值对应数量集合
36     static int[] counts = {20, 10, 20, 11, 6, 3, 5};
37 
38     public static void main(String[] args) {
39         Random ra = new Random();
40         int chgn = ra.nextInt(500) + 1;
41         int[] num = change(chgn, values, counts);
42         System.out.println("需要找零面额\t: " + chgn);
43         System.out.println("-------------------------\r\n应找:");
44         print(num, values);
45     }
46 
47     /** Function:change 找零钱
48      * @param money:人民币数额
49      * @param values:面值集合 数组
50      * @param counts:现有各面值对应数量集合 数组
51      * @return: 各面值需要数量集合 数组
52      */
53     public static int[] change(int money, int[] values, int[] counts) {
54         //用来记录需要的各种面值张数
55         int[] result = new int[values.length];
56 
57         for (int i = values.length - 1; i >= 0; i--) {
58             //需要最大面值人民币张数
59             int c = Math.min(money / values[i], counts[i]);
60             //剩下钱数
61             money = money - c * values[i];
62             //将需要最大面值人民币张数存入数组
63             result[i] = c;
64         }
65         return result;
66     }
67 
68     private static void print(int[] num, int[] values) {
69         for (int i = 0; i < values.length; i++) {
70             if (num[i] != 0) {
71                 System.out.println("面额为 " + values[i] + "\t元: " + num[i] + "\t张");
72             }
73         }
74     }
75 }

 

转载于:https://www.cnblogs.com/weijuanran/p/Greedy.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值