背包问题算法的JAVA实现

【算法】01背包问题的Java实现 动态规划算是一个非常著名的算法,基于此的各类问题也有很多,背包问题也算是赫赫有名,最近看一些OJ机试上都有此类题目。 背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分01背包和无限背包,这里主要讨论01背包,即每个物品最多放一个。而无限背包可以转化为01背包。 先说一下算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根 阅读详情
问题描述:

设U = {u1,u2,u3,......ui}(一共有amount数量的物品)是一组准备放入背包中的物品.设背包的容量为size.

定义每个物品都具有两个属性weight和value.

我们要解决的问题就是计算在所选取的物品总重量不超过背包容量size的前提下使所选的物品总价值最大.


一句话,让你的有限背包,装上最终总价值最高的物品。


注意,代码里面我加上了打印语句,可以用来查看算法的过程

  1. import java.util.Arrays;
  2. /**
  3.  * 背包问题
  4.  * @author 赵学庆 java2000.net
  5.  *
  6.  */
  7. public class T {
  8.   /**
  9.    * @param value 价值
  10.    * @param weight 重量
  11.    * @param capicity 背包容量
  12.    * @param m 表示只有w[i],w[i+1]...w[n]这些物品时,背包容量为j时的最大价值
  13.    */
  14.   public static void knapsack(int[] value, int[] weight, int capicity, int[][] m) {
  15.     // 数量
  16.     int n = value.length - 1;
  17.     // 最后一个重量-1和容量的更小的一个
  18.     int jMax = Math.min(weight[n] - 1, capicity);
  19.     // 将最后一个数组的前部分清空。
  20.     for (int j = 0; j <= jMax; j++)
  21.       m[n][j] = 0; // 当w[n]>j 有 m[n][j]=0
  22.     showArray(m);
  23.     // 后半部分设置为此物品的价值
  24.     // m[n][j] 表示只有w[n]物品,背包的容量为j时的最大价值
  25.     for (int j = weight[n]; j <= capicity; j++)
  26.       m[n][j] = value[n]; // 当w[n]<=j 有m[n][j]=v[n]
  27.     showArray(m);
  28.     // 递规调用求出m[][]其它值,直到求出m[0][c]
  29.     for (int i = n - 1; i >= 1; i--) {
  30.       jMax = Math.min(weight[i] - 1, capicity);
  31.       System.out.println(jMax);
  32.       for (int k = 0; k <= jMax; k++)
  33.         m[i][k] = m[i + 1][k];
  34.       showArray(m);
  35.       for (int h = weight[i]; h <= capicity; h++) {
  36.         System.out.println(m[i+1][h]+" / "+ m[i + 1][h - weight[i]]+" + " +value[i]+"("+h+","+weight[i]+","+value[i]+")");
  37.         m[i][h] = Math.max(m[i + 1][h], m[i + 1][h - weight[i]] + value[i]);
  38.       }
  39.       showArray(m);
  40.     }
  41.     m[0][capicity] = m[1][capicity];
  42.     if (capicity >= weight[0])
  43.       m[0][capicity] = Math.max(m[0][capicity], m[1][capicity - weight[0]] + value[0]);
  44.     System.out.println("bestw =" + m[0][capicity]);
  45.   }
  46.   public static void showArray(int[][] m) {
  47.     for (int[] a : m) {
  48.       System.out.println(Arrays.toString(a));
  49.     }
  50.     System.out.println("-------------------------------------------");
  51.   }
  52.   public static void traceback(int[][] m, int[] w, int c, int[] x) {// 根据最优值求出最优解
  53.     int n = w.length - 1;
  54.     for (int i = 0; i < n; i++)
  55.       if (m[i][c] == m[i + 1][c])
  56.         x[i] = 0;
  57.       else {
  58.         x[i] = 1;
  59.         c -= w[i];
  60.       }
  61.     x[n] = (m[n][c] > 0) ? 1 : 0;
  62.   }
  63.   public static void main(String[] args) {
  64.     // 测试
  65.     int[] ww = { 8,5,4,3 };
  66.     int[] vv = { 10,7,5,4 };
  67.     int[][] mm = new int[4][13];
  68.     knapsack(vv, ww, 12, mm);
  69.     int[] xx = new int[ww.length];
  70.     traceback(mm, ww, 12, xx);
  71.     for (int i = 0; i < xx.length; i++)
  72.       System.out.println(xx[i]);
  73.   }
  74. }

Java实现背包问题算法 背包问题是计算机科学中的经典问题,涉及到在给定的一组物品中选择最佳的物品组合,以使其总重量不超过背包所能承载的限制,同时获得最大的总价值。每个物品具有自己的重量和价值,而背包则有一个重量限制。问题的目标是找到最佳的物品组合,使得它们的总重量不超过背包的限制,同时总价值最大化。以上就是使用Java实现Knapsack背包问题算法的方法,该算法通过动态规划的方式高效地解决了背包问题,为解决实际生活中的资源分配问题提供了有力支持。方法中,我们提供了一组物品的重量和价值,以及背包的重量限制。 阅读详情

相关推荐

Java实现背包问题算法教程

背包问题,作为组合优化中的一个典型问题,其历史可以追溯到20世纪40年代。最初,背包问题是以一种纯数学的形式被提出的,当时它被视为纯数学问题。随着时间的推移,背包问题逐渐受到运筹学、计算机科学和数学界的高度关注,因为它在资源分配、任务调度、投资决策等领域有广泛的应用。随着计算机科学的发展,背包问题被赋予了新的生命,并被赋予了更多的实际意义。它不仅是算法设计与分析课程的经典案例,也被应用于密码学、图论、物流等众多领域。

weixin_35815766的博客 801

0-1背包问题

/* 题目内容: 物品集合U={u1,u2…un},体积分别为s1,s2……sn,价值分别为v1,v2….vn;容量C的背包。设计算法实现放入背包的物品价值最大。 输入描述 第一行输入物品数n,第二行输入每个物品体积,第三行输入每个物品的价值,第四行输入背包的容量C 输出描述 输出最大价值数。 输入样例 3 3 4 5 4 5 6 10 输出样例 11 */ #include<stdio.h...

@ZhengLan的博客 491

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5483

Java数据结构与算法----动态规划(背包篇)

假设:8个物品:二进制表示为 1000 ,对于装这个物品的使用情况会有:1 、2、3、4、5、6、7、8这8种情况,其实这些数字 可以由1 2 4 这三个数字组合成,对于n可以被分解成1,2,4,…多重背包和完全背包、0/1背包只有一点区别,那就是多重背包设置了物品的数量了,(完全背包的物品有无数个,0/1背包的有一个)因此,我们需要在0/1背包的基础上加上数量的循环判断装与不装。完全背包和0/1背包只有一个区别,那就是0/1背包的物品数量只有1,只可以被装1次,而完全背包的物品数量无数,可以装多次。

stu_kk的博客 2778

中兴SDH设备开局及业务配置

中兴SDH设备开局及业务配置 1.设备开局(S200-----S325) A.开电之后,按住截铃(bell off)开关,直至NCP告警灯变成橙色; B.此时,设备进入Download状态,设备IP为:192.192.192.11/24; 2.用交叉线(568A)将设备的QX口连接至电脑,电脑配置和设备相同网段的IP信息; 3.在电脑上测试连通性:pin...

weixin_33897722的博客 3999

从图像处理到AI:手把手教你用Halcon DL Tool完成第一个缺陷检测项目

本文详细介绍了如何使用Halcon深度学习工具(DL Tool)完成金属表面缺陷检测项目。从环境准备、数据采集标注到模型训练与部署,手把手指导工程师快速构建AI质检系统,显著提升工业缺陷检测效率。特别针对金属反光等难点问题提供实用解决方案。

weixin_42531886的博客 290

Java手写背包问题算法

背包问题是指在给定容量的背包和一组物品的情况下,如何选择物品放入背包,使得背包中物品的总价值最大。手写背包问题算法有助于深入理解算法原理和实现细节,提高算法的灵活应用能力。通过手写实现,可以更好地理解动态规划的思想和背包问题的解决方法。思维拓展方面,可以进一步研究背包问题的变种和优化算法,探索更高效的解决方案。

qq_22593423的博客 316

Python实战:5分钟搞定高德地图API批量地址转经纬度(附完整代码)

本文提供了一套完整的Python解决方案,利用高德地图Web服务API,实现批量地址到经纬度坐标的自动化转换。文章包含从API申请、核心代码编写到错误处理与性能优化的全流程实战指南,并附赠数据可视化方法,帮助数据分析师和开发者快速提升地理信息处理效率。

weixin_29047919的博客 583

动态规划-背包问题(java版)

这篇文章主要讲两种基础的背包问题01背包和完全背包,其实主要是作者太菜。

m0_74229735的博客 1894

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置)

1、制作系统盘 2、分区 3、重启电脑按F2

baidu_38431960的博客 1万+

Linux下基于AHCI controller模块实现SATA Platform驱动附代码详细流程

本文主要是针对ARM A55集成了AHSATA controller模块开发sata驱动,通过Platform的形式在linux识别到SSD,本文详细讲述整个开发过程,同时对SATA Platform驱动进行讲解。1、配置SATA Phy的初始化;2、打开SATA Platform相关编译开关;3、配置设备树;4、linux启动识盘。

Luckiers的博客 2497

动态规划之背包问题(java)全面总结

全面总结动态规划之背包问题,java,蓝桥杯,算法,动态规划,多种背包问题总结;背包问题优化;01背包;完全背包;多重背包;二进制优化模型;二维费用背包;分组背包;

weixin_72499901的博客 4396

YOLO11 改进、魔改|分组残差自注意力GRSA,通过分组残差优化 QKV 计算、指数空间映射优化位置偏差,在大幅降低自注意力模块参数和计算量的同时,增强特征关系与位置信息的表征能力

【摘要】研究人员提出GRSA(分组残差自注意力)机制,解决Transformer在图像超分辨率任务中效率与性能难以兼顾的问题。GRSA通过分组残差层减少自注意力参数冗余,同时采用指数空间相对位置偏差优化位置信息表征。实验表明,GRSA在降低50%参数量的同时保持模型性能,适用于目标检测和图像分割任务。在YOLO系列模型中集成GRSA可提升小目标检测精度,代码实现已开源,详细部署教程见相关视频与GitHub资源。该机制为轻量化Transformer模型提供了高效解决方案。

qq_64693987的博客 798

JAVA:实现Knapsack背包问题算法(附带源码)

JAVA:实现Knapsack背包问题算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1296

2026年瑞芯微数字IC设计笔试试卷带答案

本文主要考察数字集成电路设计相关知识,包括低功耗设计、时序分析、跨时钟域处理、总线协议等内容。试题分为单选题、多选题、代码设计题和简答题四部分。 单选题涉及门控时钟降低动态功耗、静态时序分析的限制、跨时钟域同步方案、时序违例修复方法、AHB总线信号、异步FIFO设计、半导体工艺电阻特性、二进制数转换、同步/异步复位比较以及分频电路设计等知识点。 多选题重点考查动态功耗优化技术、亚稳态特性、异步FIFO设计规范、Verilog可综合代码编写要求以及AXI总线协议特点等。 代码设计题要求实现一个同步FIFO和3

Open 217

android 蓝牙通讯demo

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

算法——“背包问题” Java代码实现

算法——“背包问题” Java代码实现 public class Knapsack { static int[] w = {2,2,6,5,4};//每件物品的重量 static int[] v = {6,3,5,4,6};//每件物品的价值 static int c = 10; public static void knapSack(int[] w,int[] v,int[][] m) { int n = v.length-1; int j

qq_45009837的博客 518

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JAVA:实现Brute Force Knapsack蛮力背包问题算法(附带源码)

JAVA:实现Brute Force Knapsack蛮力背包问题算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 2148

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java实现用动态规划算法解决背包问题

14.3 动态规划算法 14.3.1 动态规划算法介绍 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 ) 动态规划可以通过填表的方式来逐步

当一个合格的软件工程师 3152

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

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

学习记录分享 3301

动态规划算法解决背包问题(Java实现)

文章收藏的好句子:你在书本上花的任何时间,都会在某一个时刻给你回报。目录1、动态规划算法的概述2、背包问题3、动态规划算法解决背包问题 3、1 不可重复装入商品 3、2思路分析1、动态规划算法的概述(1)动态规划算法的思想是:将大问题分为小问题进行解决,使得一步步获得最优解的处理算法。(2)动态规范算法与分治算法很类似,思想都是以待解决问题先分解成 n ...

qq_37837621的博客 4312

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

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

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

利用动态规划算法实现0-1背包问题(java实现)

利用动态规划算法实现0-1背包问题 要求:测试数据以文本文件的形式存储,即所有的数据由文本文件读入。 package Zero_one_Package; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Scanner; public cla...

王较瘦的博客 4451

背包问题(Java实现)——贪心算法

背包问题——贪心算法 【问题描述】给定n种物品和一个背包。物品 i 的重量是Wi,其价值为Vi,背包的容量为c。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?  【问题分析】 ·一般的背包问题! 最优思想:考虑到价值增长和容量消耗二者的综合效果的方法,即每次选择价值与重量比 vi/wi 最大的物品先装进背包,这就是最终的贪心策略。 手动输入背包容量c和物品个数n,随机产生物品...

qq_40956679的博客 8558

用贪心算法背包问题,Java实现

package n18_背包问题贪心算法;/* * 用贪心算法解背包问题 */ public class Main { public static void main(String[] args) { // 单位重量价值分别为:10 5 7 6 3 8 90 100 double w[] = { 0, 50, 80, 30, 40, 20, 60, 10

用贪心算法解背包问题时对单位重量物品价值排序Java实现 6162

经典算法总结——背包问题(java实现)

文章目录问题描述:一、0—1背包0-1背包的优化解法:二、多重背包三、完全背包 原博客,点击这里 问题描述: 一个背包的总容量为V,现在有N类物品,第i类物品的重量为weight[i],价值为value[i] 那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大。这里装物品主要由三种装法: 1、0-1背包: 每类物品最多只能装一次 2、多重背包: 每类物品都有个数限制,第i类物品最多可以装num[i]次 3、完全背包:每类物品可以无限次装进包内 一、0—1背包 思路分析: 0-1背包问题主要涉及到两

weixin_42030357的博客 2054

01背包问题个人学习,java算法实现

问题描述:有一个背包,可放入12斤物品,现有5个物品,每个物品的重量分别为:2斤,4斤,6斤,8斤,10斤,每个物品的价值为4元,8元,12元,16元,20元,计算出可在背包中装入的最大价值?(每次每种物品只能装一次) 解析1:将物品编号为a,b,c,d,e,重量和价值对应为:a(2斤)(4元) 、b(4斤)(8元)、c(6斤)(12元)、d(8斤)(16元)、e(10斤)(20元) 当每种物品放入一次,符合背包容量,其最大价值为20元; 当物品两两放入,可分为:(2斤,4斤)(4元,8元),(2斤,6斤)

不一样的自己的博客 535
上一篇: 网友误操作,丢失代码事件的教训
下一篇: JAVA递归求对称数的算法
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值