
背包问题
按照物品的价值从高到低排序 按照物品的重量从低到高排序 根据剩余的背包容量来选择最优物品
发布日期:2021-05-16 15:24:35
浏览次数:20
分类:精选文章
本文共 1949 字,大约阅读时间需要 6 分钟。
Java实现背包问题的贪心算法
在这个实现中,我们将背包问题通过贪心算法来解决。贪心算法是一种在每一步选择最优或局部最优选择来达到全局最优的策略。在背包问题中,贪心算法通常基于物品的重量或价值进行排序,以便在有限的时间内找到最优解。
贪心算法的基本思想
贪心算法的核心思想是通过每一步的选择来逐步逼近最优解。在背包问题中,常见的贪心策略包括:
在这个实现中,我们选择了按物品的价值从高到低排序的策略。这样可以在背包容量允许的情况下,尽可能多地携带高价值的物品。
Java实现步骤
读取输入数据
- 首先,我们从标准输入读取背包的容量
m
和物品数量n
。 - 然后,我们读取每个物品的价值
v
和重量w
。
创建物品对象
- 将每个物品存储在一个
Item
对象中,并将这些对象存储在一个数组中。 - 使用
Arrays.sort()
方法对物品数组进行排序。排序的比较器是根据物品的价值从高到低排序。
贪心选择物品
- 初始化结果变量
result
为 0。 - 遍历排序后的物品数组:
- 如果当前物品的重量大于背包容量
m
,则选择这个物品并加到结果中,然后跳出循环。 - 否则,将物品的价值乘以重量加到结果中,并将背包容量减少相应的重量。
- 如果当前物品的重量大于背包容量
输出结果
- 打印最终的结果,即背包的最大价值。
代码实现
package 贪心;import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;public class 背包问题 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); Item[] items = new Item[n]; for (int i = 0; i < n; i++) { int v = sc.nextInt(); int w = sc.nextInt(); items[i] = new Item(v, w); } Arrays.sort(items, new Comparator- () { @Override public int compare(Item o1, Item o2) { return o2.v - o1.v; } }); int result = 0; for (int i = 0; i < items.length; i++) { if (items[i].w > m) { result += items[i].v * items[i].w; m -= items[i].w; break; } else { result += items[i].v * items[i].w; m -= items[i].w; } } System.out.println(result); }}static class Item { public int v; public int w; public Item(int v, int w) { this.v = v; this.w = w; }}
代码解释
- Item 类:用于存储每个物品的价值和重量。
- 主函数
main
:读取输入数据,创建物品对象,并对物品进行排序。 - 排序逻辑:根据物品的价值从高到低排序。
- 贪心选择逻辑:遍历排序后的物品,根据背包容量选择物品。
- 结果输出:打印背包的最大价值。
这种贪心算法的时间复杂度主要由排序操作决定,为 O(n log n),适用于小规模的背包问题。对于大规模的问题,可能需要采用动态规划或其他更高效的算法。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月17日 23时09分42秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
wxwidgets绘图
2019-03-16
wxwidgets事件处理
2019-03-16
用OpenCv转换原始图像数据到wximage
2019-03-16
codeblocks下wxWidgets编译与配置
2019-03-16
OpenCv+wxwidgets尝试
2019-03-16
wxwidgets自定义事件+调试
2019-03-16
wxwidgets编写多线程程序--wxThread
2019-03-16
p144循环网络
2019-03-17
三维点云处理
2019-03-17
springboot security 基于redis的session共享(7)
2019-03-17
vue 权限管理 菜单按钮权限控制(7)
2019-03-17
vue 权限管理 主题切换(8)
2019-03-17
Qt 在Excel文件中Chart绘图
2019-03-17
01-webpack5理解及配置
2019-03-17
webpack的安装和使用
2019-03-17
Vue.js学习-15-v-for循环数组内容
2019-03-17
kafka超时错误或者发送消息失败等错误,排错方式
2019-03-17
sockjs-node/info?t=1462183700002 报错解决方案
2019-03-17
FI 替代相关 OSS Note 要点记录
2019-03-17