java实现贪心算法,解决背包问题

背包问题是指有一个固定大小的背包,需要在一系列物品中选择一些放入背包中,以使得物品的总价值最大。每个物品有一个重量和一个价值,背包有一个最大容量,不能超过这个容量。

算法思路:

  1. 定义物品类Item,包含物品的重量和价值。
  2. 将物品按照单位价值(价值/重量)从高到低排序。
  3. 遍历排序后的物品列表,将单位价值高的物品先放入背包中,直到背包已满或物品全部放入为止。
  4. 如果背包未满,则将下一个单位价值次高的物品放入背包中。

代码实现及注释:

import java.util.Arrays;
import java.util.Comparator;

public class Knapsack {
    
    // 物品类,包含物品的重量和价值
    private static class Item {
        int weight; // 物品重量
        int value; // 物品价值
        
        public Item(int weight, int value) {
            this.weight = weight;
            this.value = value;
        }
    }
    
    public static void main(String[] args) {
        // 背包容量
        int capacity = 50;
        
        // 物品列表,每个物品包含重量和价值
        Item[] items = {
            new Item(10, 60),
            new Item(20, 100),
            new Item(30, 120),
            new Item(40, 140),
            new Item(50, 160)
        };
        
        // 按照单位价值(价值/重量)从高到低排序
        Arrays.sort(items, Comparator.comparingDouble((Item item) -> (double) item.value / item.weight).reversed());
        
        // 背包内物品的总价值和总重量
        int totalValue = 0;
        int totalWeight = 0;
        
        // 遍历物品列表,将单位价值高的物品先放入背包中
        for (Item item : items) {
            // 如果背包已满,退出循环
            if (totalWeight == capacity) {
                break;
            }
            // 如果当前物品的重量小于等于背包剩余容量,则将该物品放入背包中
            if (item.weight <= capacity - totalWeight) {
                totalValue += item.value;
                totalWeight += item.weight;
            }
            // 否则,将当前物品的一部分放入背包中,使得背包满载
            else {
                totalValue += (int) ((double) (capacity - totalWeight) / item.weight * item.value);
                totalWeight = capacity;
            }
        }
        
        // 输出背包内物品的总价值和总重量
        System.out.println("Total value: " + totalValue);
        System.out.println("Total weight: " + totalWeight);
    }

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值