java贪心算法案例

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>>() {@Overridepublic 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.hqwc.cn/news/29297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

[RK3568] AMP架构

Rockchip 平台异构多系统 AMP &#xff08;非对称多核架构&#xff09;的开发软件包&#xff0c;支持 Linux(Kernel) 、 Standalone(Hal)、 RTOS(RT-Thread) 组合 AMP 构建形式。 Standalone(Hal) HAL&#xff1a;Hardware Abstraction Layer&#xff0c;硬件抽象层。 硬件抽…

App的回归测试,有什么高效的测试方法?

直接抛出观点&#xff1a;高效的测试方法当然有&#xff0c;那就是采用【接口自动化】。 为了系统阐述这个问题&#xff0c;让你能有较强烈的获得感&#xff0c;本篇文章将采用下列结构进行展开&#xff1a; 1、回归测试&#xff0c;测哪些东西&#xff1f; 2、传统的回归测试…

二维费用背包(既有最大体积限制,又多加了一个最大重量限制)

1:分析状态转移方程式 2:ACcode: #include<bits/stdc.h> using namespace std; const int N1e310; int f[N][N],v[N],w[N],m[N]; void solve() {int a,b,c;cin>>a>>b>>c;for(int i1; i<a; i) cin>>v[i]>>m[i]>>w[i];//酷似01背…

SDUT 2023 summer team contest(for 22) - 1-Gym - 102220

B - Balanced Diet 题意&#xff1a;这题题意有点难搞啊&#xff0c;就是有n个物品&#xff0c;一个有m种&#xff0c;对于第 i 种物品如果你要买它就至少买 l[i]个&#xff0c;然后就是给你n行&#xff0c;每行两个数&#xff0c;ai,bi,表示这个糖果类型为bi&#xff0c;价值为…

非50欧系统阻抗的S参数测试

1. S参数依赖于系统阻抗 S参数的定义需要约定一个系统阻抗。同一个微波电路&#xff0c;在不同系统阻抗下的S参数是不同的。例如&#xff0c;50欧电阻在50欧系统阻抗下的S11为零&#xff0c;是没有反射的匹配状态&#xff1b;但50欧电阻在75欧系统阻抗下的S11不为零&#xff0…

Git教程

版本库 创建版本库 通过git init命令把目录变成Git可以管理的仓库 把一个文件放到Git仓库只需要两步&#xff1a; 第一步&#xff0c;用命令git add告诉Git&#xff0c;把文件添加到仓库&#xff1a; git add readme.txt执行上面的命令&#xff0c;没有任何显示&#xff0…

【Linux】进程间通信——管道/共享内存

文章目录 1. 进程间通信2. 管道匿名管道命名管道管道的特性管道的应用&#xff1a;简易的进程池 3. System V共享内存共享内存的概念共享内存的结构共享内存的使用代码实现 1. 进程间通信 进程间通信&#xff08;Inter-Process Communication&#xff0c;简称IPC&#xff09;是…

vue 集成tinymce2实现图片,视频以及文件的上传

vue 集成tinymce2实现图片&#xff0c;视频以及文件的上传 1. 安装插件 &#xff08;1&#xff09;安装tinymce npm install tinymce -S &#xff08;2&#xff09;安装tinymce-vue npm install tinymce/tinymce-vue3.0.1 -S 2. 复制静态文件到public目录 资源下载路径&…

【116个】网络安全测试相关面试真题

1、Burpsuite常用的功能是什么&#xff1f; 2、reverse_tcp和bind_tcp的区别&#xff1f; 3、拿到一个待检测的站或给你一个网站&#xff0c;你觉得应该先做什么&#xff1f; 4、你在渗透测试过程中是如何敏感信息收集的&#xff1f; 5、你平时去哪些网站进行学习、挖漏洞提交到…

git rebase 合并提交

一. 合并提交步骤 git log --oneline 查看当前提交记录 git rebase -i HEAD~2 选择最后提交的2条记录进行合并进入编辑界面,将c865404的pick改为f, 表示向前合并也就是向cc5a54合并 编辑完之后:wq 保存并退出git rebase --continuegit push --force origin feature/v1.2 推送…

Python venv 和 virtualenv 虚拟环境的基本使用

1.前言 venv 和 virtualenv 都是搭建虚拟环境的工具&#xff0c;virtualenv 是第三方开源的&#xff0c;而 venv 作为 virtualenv 的一个子集自 Python3.3 开始集成到标准库中&#xff0c;在 virtualenv 的文档中可以看到他们的区别&#xff1a; 没有 app-data 种子方法&#…