java贪心算法案例

news2024/11/26 10:47:07

1.零钱找回问题

这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。

2.背包问题:

背包容量=50; w[]={10,20,30} ,p[]={60,100,120} 用贪心选择(10+20)<50,p=160,但这并不是最优解,事实上(20+30)=50,p=100+120=220.才是问题的解。对于01背包,贪心采用自上而下,拆分子问题的方式为:{物品1,物品2,物品3}—>{物品2,物品3}----{物品3}…它无法保证最终能将背包装满,部分闲置的背包空间使每千克背包空间的价值降低了.
对于该问题,我们应该采用自下而上的动态规划来求解,拆分子问题的 方式为:{物品1}-------->{物品1,物品2}------>{物品1,物品2,物品3}.在求解时,应比较,选择该物品和不选择该物品,所导致的最终方案,然后再做出最好选择,为了更快求出问题的解。动态规划还记忆了过程中产生的许多互相重叠的子问题的答案。

代码

import cn.hutool.core.collection.CollUtil;

import java.util.*;

/**
 * desc: 算法测试
 *
 * @author qts
 * @date 2023/7/19 0019
 */
public class AlgorithmTest {



    public static void main(String[] args) {
        // 测试找零钱
        //System.out.println(change(320));

        // 测试背包问题
        List<HashMap<String, Object>> maps = new ArrayList<>();
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("weight", 10f);
        map.put("value",60f);
        map.put("name", "物品1");
        maps.add(map);

        map = new HashMap<String, Object>();
        map.put("weight", 30f);
        map.put("value",120f);
        map.put("name", "物品3");
        maps.add(map);

        map = new HashMap<String, Object>();
        map.put("weight", 20f);
        map.put("value",100f);
        map.put("name", "物品2");
        maps.add(map);

        sortByUnitValue(maps);
        System.out.println("物品列表: "+maps);

        List backpack = backpack(50f, maps.toArray(new HashMap[3]));

        System.out.println("结果: "+backpack);

    }

    // 钱面值
    public static int[] moneys = {100, 50, 20, 10, 5, 2, 1};
    // 对应面值的数量
    public static int[] counts = {5, 3, 0, 1, 2, 0, 3};

    /**
     * 贪心算法: 找零钱
     * @param amount 金额
     */
    public static String change(int amount) {
        StringBuilder result = new StringBuilder(amount + " = ");

        for (int i = 0; i < moneys.length; i++) {
            if (amount <= 0) {
                break;
            }

            int curMoneyCount = Math.min(amount / moneys[i], counts[i]);

            amount = amount - curMoneyCount * moneys[i];
            if (curMoneyCount > 0) {
                if (i > 0) {
                    result.append(" + ");
                }
                result.append(curMoneyCount).append("张").append(moneys[i]);
            }

        }

        if (amount > 0) {
            return "无解";
        }

        return result.toString();
    }


    /**
     * 单位价值倒序
     * @param maps
     */
    private static void sortByUnitValue(List<HashMap<String, Object>> maps) {
        CollUtil.sort(maps, new Comparator<HashMap<String, Object>>() {
            @Override
            public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) {
                Float weight1 = (Float) o1.get("weight");
                Float value1 = (Float) o1.get("value");
                Float unitValue1 = value1/weight1; // 单位重量的价值

                Float weight2 = (Float) o2.get("weight");
                Float value2 = (Float) o2.get("value");
                Float unitValue2 = value2/weight2; // 单位重量的价值

                return (int) ((unitValue2 - unitValue1));
            }
        });
    }

    /**
     * 贪心算法: 背包问题
     * @param capacity 背包容量
     * @param maps 物品,从最优到最次排序
     * @return
     */
    public static List<HashMap<String,Object>> backpack(Float capacity,HashMap<String,Object>[] maps) {
        List<HashMap<String,Object>> result = new ArrayList<HashMap<String, Object>>();

        for (int i = 0; i < maps.length; i++) {
            if (capacity <= 0) {
                break;
            }

            HashMap<String, Object> goods = maps[i];
            Float weight = (Float) goods.get("weight");// 重量
            Float value = (Float) goods.get("value");// 价值
            String name = (String) goods.get("name");// 名称

            Float unitValue = value/weight; // 单位重量的价值

            float min = Math.min(capacity, weight);

            capacity -= min;// 剩余背包容量

            HashMap<String, Object> map = new HashMap<>();
            map.put("weight",min);
            map.put("name",name);

            result.add(map);
        }

        return result;

    }

}

结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年,从0彻底打通自动化测试进阶高级岗,卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自动化测试的分…

【设计模式】2、工厂方法模式

文章目录 当你在编写代码的过程中&#xff0c; 如果无法预知对象确切类别及其依赖关系时&#xff0c; 可使用工厂方法。 工厂方法将创建产品的代码与实际使用产品的代码分离&#xff0c; 从而能在不影响其他代码的情况下扩展产品创建部分代码。 例如&#xff0c; 如果需要向应…

Redis的五大数据类型和各自的

- 字符串(String) string 数据结构是简单的 key-value 类型。简单动态字符串**&#xff08;simple dynamic string&#xff0c;SDS&#xff09;。相比于 C 的原生字符串&#xff0c;Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据&#xff0c;并且获取字符串长度复杂度…

手把手教你玩爆破 --- 关于暴力破解的一些故事

今天不是来打游戏的&#xff0c;我们的重点是了解一些针对web登陆界面的爆破手法。 就是在很多场合中上不了台面的一类攻击手法。简单的通过正常请求的发送&#xff0c;不断尝试用户名密码&#xff0c;最终登陆上去的方法。我们可以称之为爆破、穷举攻击。 1.概述 穷举就是枚…

OpenCv之图像金字塔

目录 一、图像金字塔介绍 二、高斯金字塔 三、拉普拉斯金字塔 一、图像金字塔介绍 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说&#xff0c;图像金字塔是同一图像不同分辨率…

基于区块链技术的元宇宙游戏将成为时代浪潮的弄潮儿

区块链技术作为互联网新兴技术逐渐走进公众视野&#xff0c;其中心化、分布式、公开透明、不可篡改等技术特性使其可以在各个领域大展拳脚。区块链技术在金融、公益、文化、物流、农业等领域带来了全新的思维视角、全新的场景与全新的解决方案&#xff0c;无疑是移动互联网之后…

Spring Batch之读数据库—JdbcCursorItemReader之自定义PreparedStatementSetter(三十八)

一、自定义PreparedStatementSetter 详情参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目实例 2.代码实现 BatchMain.java&#xff1a; package com.xj.dem…

推荐10款设计师都在用的3d机械工程软件

新产品和系统的研究和开发需要特定的软件。您必须能够设计建筑物、系统、机械和设备的蓝图和示意图。您还需要能够与其他工程师、绘图员和团队成员协作&#xff0c;同时有效且高效地工作。设计工程师的软件必须简化其流程&#xff0c;以避免妨碍他们的设计和开发工作。 好的工…

SpringBoot项目中WEB与Controller的联系--【SB系列之009】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 ———————————————— SpringBoot项目中WEB页面放哪里–【SB系列之008】SpringBoot项目中WEB与Controller的联系–【SB系列之009】SpringBoot项目中MVC…

喜报|英码科技联合广师大荣获“智芯杯”AI芯片应用创新创业大赛两大奖项

7月15日&#xff0c;由中国仪器仪表学会主办的全国首届“智芯杯”AI芯片应用创新创业大赛总决赛暨颁奖典礼圆满结束&#xff0c;英码科技联合广东技术师范大学设计开发的“AI视觉&#xff0c;让工厂建设更智慧”和“基于AI的智慧校园无感考勤系统”创新项目均荣获三等奖。 ​ 自…

曲师大2023大一新生排位赛-C.String题解

C.String 题目描述 众所周知&#xff0c;许师哥精通字符串。 一天&#xff0c;许师哥意外的获得了一个字符串&#xff0c;但他发现这个字符串并不是一个回文串&#xff0c;因此他非常生气。于是他决定从这个字符串中删除若干个字符使得 剩余的字符串为一个回文串。 回想回文串…

如何选购开放式耳机?开放式蓝牙耳机哪些品牌比较好?开放式耳机选购指南!

作为一个耳机爱好者&#xff0c;最近更是喜欢上了开放式蓝牙耳机&#xff0c;实际用过的起码有十几款&#xff0c;但其实最终能留下来的也只有四五款。由于前期并不知道应该如何选择开放式耳机&#xff0c;经常都会高价买到些质量差、音质也不好、漏音大的开放式耳机&#xff0…

SpringBatch从入门到实战(十一):事务控制

一&#xff1a;事务模型 Step之间事务独立。Step划分成多个Chunk执行&#xff0c;Chunk事务批次独立&#xff0c;互不影响。Chunk开始启动一个事务&#xff0c;Chunk结束时提交或者回滚事务。 二&#xff1a;事务回滚控制 默认情况下&#xff0c;无论是设置了重试retry&#…

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队

一、问题背景 相信大家在日常的开发过程中都遇到过Jar包冲突的问题&#xff0c;emm&#xff0c;在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发&#xff0c;各种第三方包之间可能…

低代码如何帮助企业数字化转型?

在数字化时代背景下&#xff0c;企业都面临着巨大的数字化转型挑战。为了迎接这一挑战&#xff0c;企业软件开发工具和平台都在不断地创新和进化。其中&#xff0c;低代码开发平台应运而生&#xff0c;并成为了众多企业转型的首选方案。企业为什么都选择低代码开发平台&#xf…

【机器学习】PyTorch手动实现Logistic算法

参考地址&#xff1a;点击打开 计算较为繁琐&#xff0c;需要用到sigmoid函数和梯度下降算法&#xff0c;步骤主要如下&#xff1a; 二项分布概率公式表示最大似然估计和对数化计算求道带入梯度下降算法计算和优化 代码&#xff1a; import numpy as np import matplotlib.p…

[CPU飙升排查]生产CPU飙升,YGC不断的事故

背景 最近给上线还未使用的服务配置监控,监控系统电话将我呼醒 ,导致原本就不多的头发一阵掉落. 还好系统还没有流量进入,先免打扰,第二天再处理. 查看面板情况如下: FGC正常 YGC不断 CPU飙升 思路确定 分析了下YGC不断,但是没有FGC,CPU飙升,可能出现的情况是哪里有活锁或者…

数据迁移卷不动了?Squids DBMotion新增多种数据库迁移能力

Squdis DBMotion新增了多种数据库的迁移能力&#xff1a;SQLServer to SQLServer、Redis to Redis、MySQL to Kafka&#xff0c;增加了列映射、校验任务独立、抽样校验、校验复检和限速等十多项功能。 本次版本更新&#xff0c;DBMotion新增了三种数据库迁移同步的场景。目前&…

el-table组件插槽“slot-scope”

目录 一、代码展示 二、返回的数组对象不含value或者ispass&#xff0c;不会报错 三、插槽里面放的是要手动输入的值时 一、代码展示 <el-table v-loading"loading" :data"checklistList" selection-change"handleSelectionChange"><…

轻松实现数据一体化:轻易云数据集成平台全解析

在当今快速发展的商业环境中&#xff0c;企业面临着大量来自多样数据源的数据。如何将这些数据进行高效集成和利用&#xff0c;成为企业数字化转型的关键挑战。轻易云数据集成平台提供了一个一站式的解决方案&#xff0c;帮助企业实现数据的无缝集成和高效利用。下面我们将通过…