Java初解背包问题

【自用】0-1背包问题与完全背包问题的Java实现 背包问题是计算机科学领域的一个经典优化问题,分为多种类型,其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益,但它们之间存在一些关键的区别:0-1背包问题允许每个物品只能选择一次,而完全背包问题则允许无限次选取同一物品。本篇博客将分别介绍这两个问题的动态规划解法,并附带相应的Java代码实现。 阅读详情

Java初解背包问题

经典背包问题:

有n个重量和价值分别为w和v的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。

限制条件: 1<= n <=100

1<=w,v,<=100

1<= W <=1000

样例:

输入:

n=4 {w,v} = {{2,3},{1,2},{3,4},{2,2}} W = 5

输出:

7

解法一:

针对每个物品是否放入背包进行搜索试试

代码:

package thebackage;

/*
 * 背包问题解法一
 */
public class FirstB {
	int AW = 0;
	int n;
	int[] weight;
	int[] value;
	public FirstB(int n,int[] weight,int[] value) {
			this.n = n;
			this.weight = weight;
			this.value = value;
	}
	public int FtheMax(int i,int j) {
		
		if (n==i) {
		//没有剩余物品
			AW=0;
		} else if(weight[i]>j){
		//无法挑选这个物品
			AW=FtheMax(i+1, j);
		} else {
		//在挑选和不挑选进行搜索
			AW=max(FtheMax(i+1, j), FtheMax(i+1,j-weight[i])+value[i]);
		}
		return AW;
	}
	
	public int  max(int a,int b) {
		if (a>b) {
			return a;
		}else {
			return b;
		}
		
	}
	public static void main(String[] args) {
			int n=4;
			int w=5;
			int[] value = {3,2,4,2};
			int[] weight = {2,1,3,2};
			FirstB firstB = new FirstB(n, weight, value);
			System.out.println(firstB.FtheMax(0, w));
			
	}

}
这种解法搜索深度为n,并且每一层都需要两次分支,最坏需要O(2^n)的时间
解法2可以尝试利用记忆化搜索进行优化

先上代码:

package thebackage;

/**
 * 
 * @author linziyu
 *优化背包问题
 */
public class SecondB {
		
	int n;
	int[] value;
	int[] weight;
	int values = 0;
	int[][] dp = new int[100][100];//进行结果记录
	
	public SecondB(int n,int[] value,int[] weight) {
			this.n = n;
			this.value = value;
			this.weight = weight;

	}
	
	public int theBest(int i,int weights) {
		if (dp[i][weights]>0) {
		//已经计算过的话直接使用之前的结果
			return dp[i][weights];
		}  
		
		if(i==n){
			values=0;
		} else if (weight[i]>weights) {
			values=theBest(i+1, weights);
		} else {
			values=max(theBest(i+1, weights), theBest(i+1,weights-weight[i])+value[i]);
			
		}
		//将结果记录在数组中
		return dp[i][weights]=values;
		
	}
	
	public int max(int a,int b) {
		if (a>b) {
			return a;
		} else {
			return b;
		}
	}
	
	
	
	public static void main(String[] args) {
		int n=4;
		int w=5;
		int[] value = {3,2,4,2};
		int[] weight = {2,1,3,2};
		SecondB secondB = new SecondB(n, value, weight);
		System.out.println(secondB.theBest(0,w));
		
	}

}

此优化可以使得对于同样的参数,只会在第一次被调用到时执行递归部分,第二次之后都会直接返回,参数组合不过nW中, 所以只需O(nW)的复杂度就可以解决。

Java使用动态规划算法思想解决01背包问题 最优性原理体现为问题的最优子结构特性,对于一个问题,如果能从较小规模的子问题的最优解求得较大规模同类子问题的最优解,最终得到给定问题的最优解,也就是问题的最优解中所包含的子问题的最优解,这种性质被称为最优子结构性质。最优子结构特性使得在从较小问题的解构造较大问题的解时,只需考虑子问题的最优解,然后以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解,它保证了原问题的最优解可以通过求解子问题的最优解来获得,最优子结构的特性是动态规划算法求解问题的必要条件。... 阅读详情

相关推荐

Java实现背包问题算法教程

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

weixin_35815766的博客 801

Java-算法-动态规划-背包问题

一. 背包问题介绍 二. 0/1背包 1. dp表 2. 状态转移方程 3. 代码实现 4. 滚动数组 5. leetcode实战 (1)leetcode416分割等和子集

weixin_45532984的博客 7748

ElasticSearch集群搭建

docker安装es集群

weixin_46562226的博客 2026

动态规划——01背包问题(Java)

01背包问题,动态规划

m0_52861211的博客 2824

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

层次分析法: 层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀) 评价类问题: 分析问题得出评判问题的子标,分别给不同子标赋予权重(权重和要为1) ...

m0_58882109的博客 1万+

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

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

weixin_72499901的博客 4397

智能检查点优化:动态频率与差异化存储的断点续训实践(模型训练丨容错机制丨人工智能)

本文深入探讨了大规模模型训练中智能检查点优化的核心实践。针对传统固定频率保存导致的存储浪费与恢复缓慢问题,提出了基于损失变化率的动态频率算法与分层差异化存储策略。通过PyTorch代码示例,详细展示了如何实现动态调度与增量保存,有效降低存储成本,并确保训练中断后能快速、可靠地恢复,显著提升训练任务的容错能力与经济效益。

weixin_29072299的博客 335

0-1背包问题(Java详解)

有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

qq_45910820的博客 4019

YOLOv8改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用

本文记录的是利用优化的目标检测方法研究。深度可分离卷积可以减少FLOPs,但会导致更高的内存访问,引起延迟并减慢整体计算。部分卷积利用逐点卷积处理通道冗余,减少模型计算量和内存访问量。Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks及其改进的实现代码如下: 四、创新模块 4.1 改进点⭐ 模块改进方法:直接加入(第五节讲解添加步骤)。模块加入如下:模块改进方法:基于的(第五节讲解添加步骤)。第二种改进方法是对中的进行改进,并将

Limiiiing的博客 1016

pycharm报错cannot start the IED:Error occurred during initialization of VMagent library failed...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1928

[java]背包问题

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 v,价值是 w。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。

乖松鼠的博客 917

21天学会基于 Linux 的 NPU 固件开发--12.3 如何参与 Linux 内核 NPU 子系统开发

从修复一个简单的文档拼写错误开始,或者为现有的开源 NPU 驱动(如 Sophgo, StarFive, Etinix 等厂商已上游化的驱动)添加一个缺失的 IOCTL 支持或优化一个算子,都是伟大的第一步。在 2026 年的 Linux Kernel (v6.12+) 中,NPU 驱动不再是孤立的字符设备,而是深度集成在 DRM 和 DMA-BUF 生态中,实现了与 GPU 类似的资源管理和调度能力。内核驱动必须提供清晰的 UAPI (User API),通常定义在。Step 4: 合并 (Merge)

amy_mhd的博客 68

回溯法经典例题(一):java解01背包问题

经典例题 0-1背包问题 问题定义【来自百度百科】 我们有n种物品,物品j的重量为wj,价格为pj。 我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为c。 如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题 实例描述 对于n=3的0-1背包问题, 物品的重量为w={16, 15, 15}, 物品的价值为p={45, 25, 25},背包承重最大值:C=30,求背包中能够装...

sc2333的博客 1万+

【机器学习】推理时计算优化——思维链(Chain-of-Thought)与慢思考范式 第一章:基础理论与认知框架 第二章:计算优化技术与前沿方法

过程监督在数学推理中展现出显著优势,因其能够定位错误发生的具体步骤,而非仅在最终答案处提供稀疏反馈。然而,高质量过程标注的获取成本高昂,这催生了基于自动验证器的近似方法。

VectorShift的博客 73

android 蓝牙通讯demo

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

贪心算法 背包问题 java_贪心算法解背包问题

背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1 <= i <= n。这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。基本步骤:1、算每种物品单位重量的价值Vi/Wi2、依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包3、若将这种物品全部装入背包后...

weixin_29055699的博客 1843

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

背包问题——01背包|完全背包

01背包你真的都会吗?各位佬们还不进来看看?

冷兮雪的博客 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

几种背包问题(java实现)

细说背包问题(java实现) 背包问题是经典的动态规划问题。分成以下几种细说一下背包问题。代码为java实现。 1. 01背包问题 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。 定义一个二阶矩阵dp[N+1][V+1], dp[i][j]表示在 只能选择前i个物品,背包容量为j的情况下,背包中物品的最大价值。 这里之所以要N+1和V+1,是因为第0行表示

baidu_41602099的博客 6030

01背包问题

01背包问题 商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品。装哪些商品才能获得最大的收益呢?在限定条件内找到最佳的物品组合,这样的问题统称为背包问题。 根据限定的条件不同,背包问题还可以细分: 部分背包问题:所有物品是可再分的,即允许将某件物品的一部分(例如 1/3)放入背包; 0-1 背包问题:所有物品不可再分,要么整个装入背包,要么放弃,不允许出现“仅选择物品的 1/3 装入背包”的情况; 完全背包问题:不对每一件物品的数量做限制,同一件物品可以选择多个装

ccc369639963的博客 2万+

遗传算法解01背包问题(Java)

遗传算法解01背包问题,并给出了完整可运行的java代码

liyuming0000的专栏 6354

解背包问题

出处:https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem import java.util.ArrayList; import java.util.List; /** * 背包问题就是给一些物品(set,不重复),每个物品有重量和价值 * 决定每个物品的数量,保证包能装得下,并且所有物品价值最高 * * [0/1背包问题] 就是一个物品的个数为1或者

wanglt311的博客 645

背包问题——分数背包问题和0-1背包问题

背包问题,动态背包,分数背包,0-1背包,java

LinlinBug的博客 1168

Java 背包问题

背包问题背包1背包2背包3背包4 背包1 常用、常见 代码片. public static void pakege(int [] w,int []v,int maxw) { // int[] w = {3,5,2,6,4};//物品重量 // int[] v = {4,4,3,5,3};//物品价值 // int maxw = 12;//背包容量...

clinke的博客 1168

回溯算法之01背包问题的解--java实现

最近在学习数据结构与算法这块,参考别人的代码,自己写了一遍回溯算法的01背包问题实现,记录一下,以备自己复习。 01背包指在背包可承受重量范围内的情况下,使得装入背包中物品的价值最大。 代码如下: public class Backtrack01Knapsack { public static int maxV = 0; public static void main(S...

donyzh的博客 1114

【动态规划法】之01背包问题java实现

问题描述 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi背包的容量为C。问如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 01背包问题的目标是使背包中物品的价值最大。约束条件有两个:一是物品的重量不能超出背包的容量。二是物品只能整体放入背包,不能部分放入。 问题分析 (1)最优子结构 反证法 设(y1,y2,……,yn)是所给01背包问题的一个最优解,则(y2,y3,……,yn)是子问题的一个最优解。子问题满足以下条件:一是物品的总价值是物品y2,y3,……,yn的总价值和;二是物品的

xiangjunyes的博客 2910
上一篇: 多源最短路径( Floyd算法)JAVA实现
下一篇: Netty中的SimpleChannelInboundHandler的通信过程
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值