贪心算法之背包问题

2023-11-12

贪心算法之背包问题

背包问题是算法的经典问题,分为部分背包和0-1背包,主要区别如下:

部分背包:某件物品是一堆,可以带走其一部分

0-1背包:对于某件物品,要么被带走(选择了它),要么不被带走(没有选择它),不存在只带走一部分的情况。

部分背包问题

假设一共有N件物品,第 i 件物品的价值为 Vi ,重量为Wi,一个小偷有一个最多只能装下重量为W的背包,他希望带走的物品越有价值越好,可以带走某件物品的一部分,请问:他应该选择哪些物品?

假设背包可容纳50Kg的重量,物品信息如下表:

将物品按单位重量 所具有的价值排序。总是优先选择单位重量下价值最大的物品,单位重量的价值排序:物品A > 物品B > 物品C

因此,我们尽可能地多拿物品A,直到将物品1拿完之后,才去拿物品B,然后是物品C 可以只拿一部分…..

public class Bag {
    /**
     * 最大承重
     */
    private double max=0;

    private void getMaxValue(Goods[] goodsList){
        // 对物品按照价值排序从高到低
        Arrays.sort(goodsList, Comparator.comparingDouble((Goods goods) -> goods.value).reversed());

        //当前总重
        double sumWeight=0;

        // 取出价值最高的
        for(int i=0;i<goodsList.length;i++){
            sumWeight+=goodsList[i].weight;
            if(sumWeight<=max){
                System.out.println(goodsList[i].name+"取"+goodsList[i].weight+"kg");
            }
            else{
                System.out.println(goodsList[i].name+"取"+(max-(sumWeight-goodsList[i].weight))+"kg");
                return ;
            }
        }
    }


    public static void main(String[] args) {
        Bag bag=new Bag();
        Goods g1=new Goods("A",10,60);
        Goods g2=new Goods("B",20,100);
        Goods g3=new Goods("C",30,120);
        Goods[] goods={g1,g2,g3};
        bag.max=50;
        bag.getMaxValue(goods);
    }

}

public class Goods {
    /**
     * 名称
     */
    String name;
    /**
     * 重量
     */
    double weight;
    /**
     * 价格
     */
    double price;
    /**
     * 价值
     */
    double value;

    public Goods(String name, double weight, double price) {
        this.name = name;
        this.weight = weight;
        this.price = price;
        this.value=price/weight;
    }
}

0-1背包问题

有n件物品和一个最大承重为W的背包,每件物品的重量是w[i],价值是v[i],在保证总重量不超过W的前提下,选择某些物品装入背包,背包的最大总价值是多少?

注意:每个物品只有一件,也就是每个物品只能选择0件或者1件

分析:

假设:W=10,有5件物品,重量和价值如下:

w[1]=2,v[1]=6

w[2]=2,v[2]=3

w[3]=6,v[3]=5

w[4]=5,v[4]=4

w[5]=4,v[5]=6

dp数组的计算结果如下表:

i:选择i件物品 j:最大承重
public class Bag01 {
    public static int maxValue(int[] values, int[] weights, int max){
        if(values == null || values.length == 0){
            return 0;
        }
        if(weights == null || weights.length == 0){
            return 0;
        }
        if(max <= 0){
            return 0;
        }
        int dp[][] = new int[values.length+1][max+1];
        for (int i = 1; i <= values.length; i++) {
            for (int j = 1; j <= max; j++) {
                // 选中的物品重量
                int selectedWeight = weights[i - 1];
                // 如果选择的物品重量超过最大承重
                if(selectedWeight > j){
                    // 最大的价值 = 上一轮的最大价值(不选择该物品)
                    dp[i][j] = dp[i-1][j];
                }else {
                    // 选择物品
                    // 选择该物品之后的价值 与 不选择该物品的价值(上一轮的最大价值)做比较,找出最大值
                    dp[i][j] = Math.max(dp[i-1][j],values[i-1]+dp[i-1][weights[i-1]]);
                }
            }
        }
        return dp[values.length][max];
    }

    public static void main(String[] args) {
        int[] values={6,3,5,4,6};
        int[] weights={2,2,6,5,4};
        int max = 10;
        System.out.println(maxValue(values,weights,max));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

贪心算法之背包问题 的相关文章

随机推荐

  • 在分页式管理方式下实现主存空间的分配和回收

    转自 在分页式管理方式下采用位示图来表示主存分配情况 实现主存空间的分配和回收 呱呱乐编程 CSDN博客 方便学习 如有侵权 联系本人 立即删除 include
  • 5e服务器信息被拦截,5e登陆csgo总被拦截什么意思(5e进csgo提示被拦截)

    办法1 验证游戏完整性重启steam 2 重启计算机 3 可能是系统兼容性问题win10 64 建议更换系统 4 到游戏目录里用管理员身份启动试试 希望能够帮助你 望采纳 好像是进程里有多个steam客户端进程 或者你5e配置的游戏路径不对
  • Vue使用AntV/G2例子

  • vue项目文件导入导出的方法总结

    文件导入 点击文件上传时点击按钮的结构 用element ui组件的el upload组件 点击时的方法需要传入一个file文件的参数下来 按钮结构
  • vue3全局引入element-plus后使用 Message 消息提示

    import ElementPlus from element plus const app createApp App app use ElementPlus mount app 使用confirm的方式 proxy confirm
  • 毕业设计-基于深度学习的实例分割研究

    目录 前言 课题背景和意义 实现技术思路 一 实例分割研究现状 二 实例分割的特殊应用 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学
  • Python爬取头像网站图片

    import urllib request from urllib import request from bs4 import BeautifulSoup x 1 url https www woyaogexing com touxian
  • Spring SringMVC之配置文件配置学习

    废话不多说 先来一个web项目web xml实际例子 web xml
  • 学习如何使用github

    转载自 http www open open com lib view open1396580186465 html 以提交的一次开源代码为例 教会你步入开源的世界 1 首先登陆到https github com平台上注册一个自己的账号 这
  • [图像处理]YUV图像处理入门3

    5 yuv420格式的灰阶测试图 本程序中的函数主要是为YUV420P视频数据流的第一帧图像添加边框 函数的代码如下所示 file 5 yuv graybar cpp author luohen brief gray scale bar o
  • 【云原生之Docker实战】容器的资源限制使用方法

    云原生之Docker实战 容器的资源限制使用方法 一 容器资源限制介绍 二 检查本地Docker状态 三 查看本地容器系统相关文件 1 查看容器配置目录 2 查看内存相关文件 3 查看cpu相关文件 四 容器内存资源的限制 1 查看内存限制
  • Linux下Shell脚本编程简介

    最近经常使用Linux 感觉太频繁地敲击键盘有些累了 于是想到了Shell脚本 可以把太多的命令写成一个脚本 这样每次执行一遍sh文件 就可以省去了敲击键盘的时间 还可以保护键盘哦 于是在网上搜了一些有关Linux下脚本编程的内容 Shel
  • Spring Data MongoDB 更新整个对象

    第一步 在pom xml文件中引入下述依赖 当前Spring Boot的版本为 2 7 6
  • 益聚星荣:一文看懂,为什么有的投资人讨厌元宇宙,有的却爱死它了

    元宇宙里没有新东西 或许十年之后 它就会成为未来的互联网 在我们身边无处不在 再一次 周鸿祎对热潮中的科技新概念表达了不看好 11月20日 周鸿祎做客央视 对话 节目时 直言元宇宙 代表着人类的没落 在他的理解中 元宇宙的一切东西都还是虚幻
  • VS2019下OpenCV3.4.9的环境搭建

    VS2019下OpenCV3 4 9的环境搭建 目录 VS2019下OpenCV3 4 9的环境搭建 1 首先下载OpenCV3 4 9 2 配置环境变量 1 修改用户变量 2 修改系统变量 3 新建VS工程并进行设置 1 设置包含目录 2
  • 如何查看服务器端屏蔽的网站,服务器怎么查看和屏蔽端口号

    服务器怎么查看和屏蔽端口号 内容精选 换一换 Linux云服务器一般采用SSH连接方式 使用密钥对进行安全地无密码访问 但是SSH连接一般都是字符界面 有时我们需要使用图形界面进行一些复杂操作 本文以Ubuntu 18 04操作系统为例 介
  • Makefile 与 GCC G++ 入门

    Makefile和g 学习笔记 g 部分 学习C和C 的同学应该都知道 gcc是一款跨平台的C C 编译器 可以在Linux Windows平台下使用 具有十分强大的功能 结构也十分灵活 并且可以通过不同的前端模块来支持各种语言 如Java
  • HTTPS详细总结

    最近学习htpps 下面来总结一下 以下内容多来源于网上 出错不详了 仅仅当做自己做笔记用 HTTPS详解 很多人可能不能很好的理解HTTPS 不能理解为什么HTTPS的代码要那样写 因此我写了这片博客 希望能让更多人了解HTTPS 密码
  • java Excel文件上传 解析入库

    ApiOperation 上传文件 RequestMapping value uploadFile method RequestMethod POST public BusinessResult uploadFile RequestPara
  • 贪心算法之背包问题

    贪心算法之背包问题 背包问题是算法的经典问题 分为部分背包和0 1背包 主要区别如下 部分背包 某件物品是一堆 可以带走其一部分 0 1背包 对于某件物品 要么被带走 选择了它 要么不被带走 没有选择它 不存在只带走一部分的情况 部分背包问