贪心算法_01背包问题_Java实现

动态规划DP——01背包问题 01 背包问题   今天在算法课上讲解了动态规划算法,其中讲到了01背包问题。这是一种典型的动态规划问题,于是下课之后我使用java进行了相对应的代码实现。动态规划求解具有以下的性质: 1.最优子结构性质:最优解包含了其子问题的最优解,不是合并所有子问题的解,而是找最优的一条解线路,选择部分子最优解来达到最终的最优解。 2.子问题重叠性质:先计算子问题的解,再由子问题的解去构造问题的解(由于子问题... 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/ljmingcom304/article/details/50310789 
本文出自:【梁敬明的博客】

1.贪心算法

  什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。因此贪心算法不会对所有问题都能得到整体最优解,但对于很多问题能产生整体最优解或整体最优解的近似解。

2.01背包问题  

  一个旅行者有一个最多能装m公斤的背包,现在有n中物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为C1、C2、……、Cn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大?

3.算法分析  

  当遇到这样的问题,我们可以换一种角度去思考,假设在一个100m3的房子里面,现在要将房子装满,同时要保证放入的物品个数最多以及装入的东西最重,现在身边有铁球和棉花,请问大家是放铁球进去好呢还是放棉花进去好呢?显而易见,放入铁球进去是最优选择。但是原因是什么呢?很简单,就是因为铁球的密度较大,相同体积的铁球和棉花相比,铁球更重。 
  不过前提是放入第一个铁球时,铁球的体积V1小于等于100m3 ;放入第二个铁球时,铁球的体积V2 小于等于(100-V1)m3;……;放入第n个铁球时,铁球的体积小于等于(100- ∑n1∑1nVn-1)m3 ,要是第n个铁球的体积大于(100- ∑n1∑1nVn-1)m3 ,还真是不如放点单位体积更轻的棉花进去,说的极端点就是所有铁球的体积都大于100m3 ,还真不如随便放入点棉花进去合算。所以总是放铁球进去,不考虑是否放入棉花,容易产生闲置空间,最终会得不到最优选择,可能只是最优选择的近似选择。 
  现在再次回到背包问题上,要使得背包中可以获得最大总价值的物品,参照铁球的例子我们可以知道选择单位重量下价值最高的物品放入为最优选择。但是由于物品不可分割,无法保证能将背包刚好装满,最后闲置的容量无法将单位重量价值更高的物品放入,此时要是可以将单位重量价值相对低的物品放入,反而会让背包的总价值和单位重量的价值更高。假设现在背包的剩余总重量为5kg,存在一个4kg价值为4.5的物品,一个3kg价值为3的物品,一个2kg价值为2的物品,很显然将3kg和2kg的物品放入背包中所获得的价值更高,虽然没有4kg的物品单位重量的价值高。因此通过贪心算法求解01背包的问题可能得不到问题的最优解,得到的是近似最优解的解。 
  创建一个物品对象,分别存在价值、重量以及单位重量价值三种属性。

public class Knapsack implements Comparable<Knapsack> {
    /** 物品重量 */
    private int weight;
    /** 物品价值 */
    private int value;
    /** 单位重量价值 */
    private int unitValue;

    public Knapsack(int weight, int value) {
        this.weight = weight;
        this.value = value;
        this.unitValue = (weight == 0) ? 0 : value / weight;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getUnitValue() {
        return unitValue;
    }

    @Override
    public int compareTo(Knapsack snapsack) {
        int value = snapsack.unitValue;
        if (unitValue > value)
            return 1;
        if (unitValue < value)
            return -1;
        return 0;
    }

}
  按照贪心算法将物品放入背包中。
public class TXSFProblem {
    // 现有的物品
    private Knapsack[] bags;
    // 背包的总承重
    private int totalWeight;
    // 背包最大总价值
    private int bestValue;

    public TXSFProblem(Knapsack[] bags, int totalWeight) {
        this.bags = bags;
        this.totalWeight = totalWeight;
        // 对背包按单位重量价值从大到小排序
        Arrays.sort(bags, Collections.reverseOrder());
    }

    public void solve() {
        int tempWeight = totalWeight;

        for (int i = 0; i < bags.length; i++) {
            //判断当前物品是否可以放入背包中,若不能则继续循环,查找下一个物品
            if (tempWeight - bags[i].getWeight() < 0)
                continue;

            tempWeight -= bags[i].getWeight();
            bestValue += bags[i].getValue();
        }
    }

    public int getBestValue() {
        return bestValue;
    }
}
  测试最终结果:85(实际最优结果为90)
public class TXSFTest {

    public static void main(String[] args) {

        Knapsack[] bags = new Knapsack[] { new Knapsack(2, 13),
                new Knapsack(1, 10), new Knapsack(3, 24), new Knapsack(2, 15),
                new Knapsack(4, 28), new Knapsack(5, 33), new Knapsack(3, 20),
                new Knapsack(1, 8) };
        int totalWeight = 12;

        TXSFProblem problem = new TXSFProblem(bags, totalWeight);
        problem.solve();

        System.out.println(problem.getBestValue());
    }

}


  


华为OD机试 - 快递运输(Java) 一辆运送快递的货车,运送的快递放在大小不等的长方体快递盒中,为了能够装载更多的快递,同时不能让货车超载,需要计算最多能装多少个快递。因此,可以将输入的快递重量数组进行升序,依次累加,看总重量是否超过限制即可,超过限制,则对应快递不能加入,最多只能运送前面所有快递。其实,这里很容易理解,假设0~i的快递总重量都在限载内,那么下一个快递我们最优是选择什么呢?这里要求货车能装最多快递件数,其实相当于每件物品的价值为1,求解01背包问题的最大价值。因此,每次我们选择加入的都是重量最小的,才能保证结果最优。 阅读详情

相关推荐

背包问题 贪心算法实现

背包问题的贪心算法实现,简单易懂,初学者可参考

背包问题之贪心算法实现

Code: package algorithm;      /**  *   利用贪心算法,对背包问题的java实现  */   public class Knapsack {              private float m ;   //背包容量       private floa

pengchengjiji的专栏 1794

软件测试方法——等价类划分法详解

!如果下面这些资料用得到的话可以直接拿走:1、自学开发或者测试必备的完整项目源码与环境2、测试工作中所有模板(测试计划、测试用例、测试报告等)3、软件测试经典面试题4、Python/Java自动化测试实战.pdf5、Jmeter/postman接口测试全套视频获取6、Python学习路线图。

MXB1220的博客 1万+

背包算法(贪婪算法)

一、问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 二、总体思路:根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现; 三、动态规划的原理及过程:   eg:number=4,capacity=8 i 1 2 3

luyuncsd123的专栏 2356

Etcd教程 — 第三章 Etcd集群动态发现、DNS发现

Etcd教程 — 第三章 Etcd集群动态发现、DNS发现

Mr_XiMu的博客 2818

避坑指南:vue-print-nb打印隐藏元素与空白页的那些事儿

本文深入解析了使用vue-print-nb插件时,打印出现空白页及隐藏元素问题的根本原因与解决方案。核心在于理解浏览器打印原理,并通过CSS媒体查询精准控制样式。文章提供了从重置根元素高度、处理隐藏元素到控制分页的完整避坑指南,帮助开发者彻底解决打印样式难题。

weixin_29008691的博客 436

贪心算法:如何求解背包问题

本文介绍了如何用贪心算法求解背包问题。我们使用了一个数组来存储每种物品的单位重量价值,然后对数组进行降序排序,使得单位重量价值最高的物品排在最前面。然后,我们从第一个物品开始,遍历每个物品,判断是否可以放入背包,如果可以,就放入背包,更新背包中物品的总重量和总价值,如果不可以,就跳过该物品,继续下一个物品。最后,我们返回背包中物品的总价值,即为最优解。贪心算法的优点是简单易懂,执行效率高,缺点是不一定能得到全局最优解,可能陷入局部最优解。

HZH903411565的博客 2395

【项目实战】DevOps制品管理之JFrog Artifactory介绍

JFrog Artifactory是一款领先的二进制软件制品仓库管理工具,由JFrog公司开发。

奶爸的编程之路,也就一周冷个三天 1352

背包问题(贪婪法)

//................htypedef struct{ float p; float w; float v;}OBJECT;void Print (OBJECT instance[], int n);void Swamp (OBJECT &ins

风云的专栏 773

【Agent】AI Agent架构趋势及演进

本文系统介绍了AI Agent架构的发展趋势和技术框架,涵盖单Agent与多Agent系统设计、提示词工程与上下文管理、SpringAI开发框架等关键技术。重点阐述了AI原生应用参考架构,包括Nacos配置管理、Higress AI网关、RocketMQ会话状态管理等核心组件解决方案。同时深入探讨了AI应用可观测性体系,包含OpenTelemetry全链路追踪、关键指标监控以及基于LoongSuite开源工具的数据采集评估方法,为构建高效可靠的AI应用提供了全景式技术参考。

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1104

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 641

01背包问题

01背包问题 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。 输出格式 输出一个整数,表示最大价值。 数据范围 0<N,V≤1000 0<vi,wi≤1000 输入样例 4 5

qq_43649799的博客 492

OpenClaw小白使用全攻略

OpenClaw全能技能解锁指南:从基础到进阶 摘要: 本文提供OpenClaw AI智能体的完整使用教程,帮助用户从安装后"不知道如何用"到熟练掌握核心功能。教程包含:1)控制台5大区域详解和3个必做初始化设置;2)文件管理、浏览器自动化、文档生成等5大基础功能实操,每个功能配有详细操作步骤、指令模板和效果演示;3)10+高频场景解决方案,如整理文件、搜集资料、写总结等;4)进阶技巧和常见问题解答。通过清晰的图文指引,即使电脑小白也能快速上手,实现办公自动化、提升工作效率。

通俗易懂学IT 3058

Java实现01背包问题:贪心算法详解

本文介绍了用贪心算法在Java中实现01背包问题的方法。01背包问题要求在限定容量的背包中选择物品以获得最大价值。贪心算法通过按单位价值排序物品并优先装入高价值物品来求解,时间复杂度为O(n log n)。尽管贪心算法高效且实现简单,但在某些情况下无法保证全局最优解。文章详细讲解了Java代码实现,分析了贪心算法的优缺点,并与动态规划进行对比,指出贪心算法适用于需要快速近似解的场景。最后提出了改进方向和应用场景,帮助读者根据需求选择合适的算法方案。

专注于与编程相关的知识内容分享 1033

GEE APP:基于Sentinel-2遥感影像的植被指数(NDVI)和水体指数(NDWI)可视化应用

本文介绍了利用Google Earth Engine(GEE)平台处理Sentinel-2卫星数据的方法,重点讲解NDVI(归一化植被指数)和NDWI(归一化水体指数)的计算与应用。内容包括环境准备、数据加载与处理、指数计算原理、可视化方法以及实际应用案例。教程详细展示了如何定义研究区域、加载影像数据、进行指数运算,并生成专业统计报告和图例。文章还提供了常见问题解答和最佳实践建议,为生态环境监测、农业评估和水资源管理等场景提供了实用工具。通过JavaScript代码示例,读者可以快速掌握GEE平台的遥感影像

此星光明博客 272

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

利用Java实现01背包问题的贪心算法

一、问题描述 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 二、算法策略 单位价值化 三、核心代码 static double Knapsack(double[] a, double[] b, double[] x, double C, int n) { sort(a, b, ...

weixin_44753820的博客 1913

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

01背包问题的三种解法

01背包问题是一种最简单的背包问题,也是很常见的一种问题,一下分别通过遍历法,贪心算法和动态规划算法来解决这一问题。 1、遍历法:将所有组合的情况遍历一遍,为了方便,将每种组合对应一个二进制数,例如:某个背包问题中有abcde五种物品,那么00001代表只放入了a,10001代表放入了a物品和e物品。则一共有2^5=32种情况,求出每种情况下的背包总价值,记录下背包总价值最大的情况,即为最后结果

oJianYe的博客 2558

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

2018 完美世界校招笔试编程题(Java)

01背包简单题,只不过要用Java写,写了比较久一点 import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner scanner = new Scanner(System.in); int num = scanner....

ICLiuLi 2801

java的01背包问题 思路加解析

java的01背包问题 题目描述:有如下5种物品,小明的书包最多只能装下8公斤的物品,小明特别贪心,思考怎么选择使自己书包能装下并且得到的价值最大。 物品1: 6公斤   价值48元 物品2: 1公斤    价值7元 物品3: 5公斤    价值40元 物品4: 2公斤    价值12元 物品5: 1公斤    价值8元 大家先看一下题目五种物品,价值和重量各不一样,但是要求一个背包限重八公斤问你...

wstrhok的博客 187

经典算法 - 动态规划算法及背包问题(01背包与完全背包)

动态规划 动态规划算法通常用于求解具有某种最优解的问题 基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,动态规划分解得到的子问题往往不是互相独立的,即上一个子问题解可能为下一个子问题的条件(通常可以将结果填入表格) 背包问题 有一个背包容量为4kg,现在有以下物品 物体 重量 价格 吉他 1 1500 音响 4 3000 电脑 3 2000 现要求装入背包的物体价值最大,且不能超重 其中: 01背包问题:物品有

key_768的博客 3505

大疆19年校招0806笔试B卷第一题(背包问题)

同学晚上做题,我就看了看第一题,这个第一题有点像四号的第二题,但是由于游戏时间必须全部完成才能得到满意度,所以选择游戏的时候只依靠贪心算法不够了,需要用动态规划来解决问题。 题目:游戏王 小明要玩游戏,每个游戏都有它的成就值,也有玩这个游戏需要花费的时间(每个游戏必须玩完才能获得成就值)。小明总共有T的时间。求在T的时间内可以获得的最大成就值。 输入: 第一行输入case数T(0<T<...

熊仙森滴Blog 1370

01背包问题(回溯法实现,java)

上两天学习的回溯算法,老师让我们回溯法来解决01背包问题, 经过了几天的改改增增,终于实现成功了。 自我感觉回溯算法思想,从左到右,一步一步,能走则走,不能则过! 下面直接贴代码,代码上详细注释! import java.util.Arrays; /** * 回溯法的01背包 * * @author anLA * */ public class BagFBack { pr

anLA_的专栏 7936

【数据结构与算法】贪心算法解决背包问题。java代码实现

背包问题(贪心算法) 贪心算法思想 简单的说,就是将大问题转化为最优子问题,例如本题所要求的,背包容量有限,要想使物品的总价值最高,那么,我们必须尽可能的选择权重高的(即单位价值更高)的物品进行装载。 在背包问题中,物品是可拆的,即可以分成任意部分进行装载,而最终实现的目标是,背包是满的(即剩余容量为0),且总价值尽可能高。这也就是背包问题与0-1背包的根本差别所在。 解题思想 先将所有物品的权...

学习记录分享 3301

(Java)贪心算法解决01背包问题

问题描述如下: 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 经典的背包问题,这次选用贪心算法来解决 代码如下: package TXSF; import java.util.Scanner; public class BAG { public static void main(String a...

qq_40307529的博客 7665
上一篇: 分治算法_汉诺塔问题_Java实现
下一篇: Java回溯法对数字的全排列
还不够
博客等级 码龄16年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值