经典算法之0-1背包问题

Qt Installer Framework 简单使用 qt installer framework 简单使用 阅读详情

0-1背包算法是非常经典的一个算法问题,可惜我一直都只会它的递归算法,而非递归算法是今天刚刚学会的,在此记录一下。

定义一个二维数组 maxValues[ ][ ] 用来记录最大价值,maxValues[i][V]表示从前i 件物品中选择物品放入容量为V 的背包可以得到的最大价值。那么就有方程 maxValues[i][V] = max{ maxValues[i-1][V], maxValues[i-1][V-ws[i]] + values[i] } (其中ws[i] 表示第i 个物品所占空间,values[i] 表示第i 个物品的价值),下面来解释下这个方程:

每个物品都只有两种选择:放入背包或不放入。当考虑第i 个物品是否放入的时候,若我们选择放入,则可得到的价值是第i 个物品的价值再加上剩余的空间在i-1个物品中选择时可以得到的最大价值,若选择不放入,得到的价值就是现有空间在i-1个物品中选择时可得到的最大价值,显然,我们要选价值最大的那个。

下面再来优化一下,观察一下二维数组maxValues,则可发现maxValues[i-1][y]只在计算maxValues[i][x] 的时候有用(y<=x),计算完就没用了,所以这个空间我们可以省下来,直接用maxValues[i][x] 覆盖maxValues[i-1][x] 就可以,因此maxValues可以改为一维数组。

下面是0-1背包算法的递归算法代码以及非递归算法代码:

package classic;

import java.util.Scanner;

public class Pacage1 {

	private static int[] ws = null;
	private static int[] values = null;
	private static int W = 0;
	private static int items = 0;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		W = sc.nextInt();//背包的最大空间
		items = sc.nextInt();//总共有多少件物品
		ws = new int[items];
		values = new int[items];
		for(int i=0; i<items; i++){//依次读入每个物品的大小和价值
			ws[i] = sc.nextInt();
			values[i] = sc.nextInt();
		}

		int maxValue = maxValue(items-1, W);
		System.out.println("最大可装价值为:"+maxValue);
		sc.close();
	}

	private static int maxValue(int curItem, int remainW) {
		if(curItem < 0)
			return 0;
		if(remainW < ws[curItem]){
			return maxValue(curItem-1, remainW);//装不下当前的,试试下一个
		}
		return Math.max(maxValue(curItem-1, remainW), 
				maxValue(curItem-1, remainW-ws[curItem])+values[curItem]);
	}

}


 

package classic;

import java.util.Scanner;

public class Pacage2 {
	
	private static int[] ws = null;
	private static int[] values = null;
	private static int W = 0;
	private static int items = 0;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		W = sc.nextInt();//背包的最大空间
		items = sc.nextInt();//总共有多少件物品
		ws = new int[items];
		values = new int[items];
		for(int i=0; i<items; i++){//依次读入每个物品的大小和价值
			ws[i] = sc.nextInt();
			values[i] = sc.nextInt();
		}
		int[] maxValues = new int[W+1];
		int maxValue = 0;
		for(int i=0; i<items; i++){
			for(int j=W; j>0; j--){
				if(j-ws[i]<0){
					break;
				}
				maxValues[j] = Math.max(maxValues[j], maxValues[j-ws[i]]+values[i]);
				if(maxValues[j]>maxValue)
					maxValue = maxValues[j];
			}
		}
		System.out.println("最大可装价值为:"+maxValue);
		sc.close();
	}
}

绕过App某加密企业版加固Frida检测 可以发现dlsym函数加载了两次pthread_create,可以认为这两个进程(或某一个进程)是和Frida的检测有关的,于是为了绕过检测,我们可以让它加载一个虚假的pthread_create函数,得到一个空结果绕过检测。成功绕过了libnllvm1717052779924.so的检测,又到了libface_nllvm.so的检测,使用同样的方法去绕过libface_nllvm.so的检测,代码我这里就不上了,大家可以自己修改以下。dlsym()函数的作用是在已经加载的动态链接库中查找指定符号的地址。 阅读详情

相关推荐

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

5、优化项(省略此步骤,直接进行步骤6),进入到视图着色方式(此时没有灯光,整体偏暗,如果不调整灯光,烘培出来的材质也偏暗,因此此步骤为优化项,通畅建议调整)。在右边栏进入世界环境,调整颜色。7、烘焙成功之后,新建一个材质,将第三步创建的纹理图像作为材质的纹理,连接到基础色,并把模型的材质改为此材质,其他的材质全部删除。2、处理uv,在侧边栏选择数据-uv贴图,选中使用的uv,进入编辑模式,全选,键盘u,选择智能uv投射。3、处理材质,在侧边栏选择材质,进入着色,在着色器编辑器新建一个图像纹理,新建图像。

AllBluefm的专栏 2529

算法训练——背包算法

但是很多经典的问题都有其经典的套路,其它问题都可以归结到这些问题上面来,可以看做是它们的变种和延伸,把这些经典的问题吃透的话,自然能举一反三。有N种物品和一个容量为T的背包,每种物品都就可以选择任意多个,第i种物品的价值为P[i],体积为V[i],求解:选哪些物品放入背包,可卡因使得这些物品的价值最大,并且体积总和不超过背包容量。你只有一个容量有限的背包,总容量为c,有n个可待选择的物品,每个物品只有一件,它们都有各自的重量和价值,你需要从中选择合适的组合来使得你背包中的物品总价值最大。

庄小焱 4793

tesseract-ocr的字库学习步骤(训练自己的文库),关于ocr的对图片的解析,包括tesseract的安装(史上最全)

tesseract-ocr的字库学习步骤(训练自己的文库) 简介:在网上看了很多案列。都不是很完整。然后自己用了一天时间进行整理,第一次写文章,希望对大家有帮助。 一、安装tesseract 下载地址https://github.com/UB-Mannheim/tesseract/wiki 1.点击下面下载的这个进行运行(安装的时候有点慢) 2.点击next 3.I accept the terms of the License Agreement前的复选框打勾,点击Next。 4.Install f

HAC12的博客 2229

背包算法简介

一、概述 背包算法是最常见的一种DP算法。它的核心要素有三个:背包容量,物品重量,物品价值。 在不同的题目中这三要素可能表现为多种形式,比如背包容量是时间(P1048 采药),体力(P1510 精卫填海),数值(P1734 最大约数和)。物品重量和背包容量在同一题目中的概念是一致的。在物品价值方面,如果题目给了价值或者价值计算方法(P1060 开心的金明),那么我们写dp方程时按题目要求添加即可。如果没有给物品价值,只是让我们求能填充的最大容量或者求方案数,我们可以将dp数组的0号单元置1,dp[0]=1

sigd的博客 2万+

comfyui从入门到精通二:提示词规则详解

《AI绘画提示词使用全指南》摘要: 本文系统解析AI绘画提示词的核心规则与实用技巧。关键点包括:1) 空格与下划线的本质差异,webui会自动转换但comfyui保留原格式;2) 数字与单词表达(如1girl/one girl)会导致风格变化;3) 三种权重控制方式(数值标注、括号嵌套、位置效应),其中数值标注最直观有效;4) 位置衰减公式揭示提示词排序对效果的影响权重。同时指出当前AI绘画仍存在角色一致性等更复杂的技术瓶颈。全文通过多组对比实验,为创作者提供从基础语法到高阶控制的完整解决方案。

ScottePerk的博客 1926

CANdelaStudio实战:如何用19服务快速编辑DTC快照数据(附Excel模板)

本文详细介绍了在CANdelaStudio中利用19服务高效编辑DTC快照数据的进阶技巧。通过导出DTC池至Excel进行批量编辑,结合‘Copy from DTC Pool’功能实现配置复用,并分享了构建自定义Excel模板与字段映射的实用方法,帮助工程师将繁琐的手动配置转化为工程化的批量处理,大幅提升诊断数据库开发效率。

weixin_29230773的博客 191

算法学习——背包问题解决

背包问题不同解决方法的比较分析:给出穷举法、贪心法、动态规划法、回溯、分支限界法的实现,分析特点,比较效率。 1.穷举法分析 格式: 输入要求: 第一行:物品种类数n 背包容量c 第二行:可装入物品的重量 m1 m2 m3 ... mn 第三行:可装入物品的价值 w1 w2 w3 ... wn 输出要求: 第一行:背包的最大价值 示例: 输入: 5 17 ...

weixin_43906500的博客 3546

基于opencv自定义网格板的相机标定软件源码

本软件开发版使用的是VS2013和QT5.7, 安装版的需要安装VS核心库(目录里的vcredist_x64.exe, 已安装VS的不需要)。采用强大的模板匹配算法,本程序适用于自定义大范围网格标定(本例程网格使用的是自己画的网格板31*21*10cm),网格点识别度高,矫正速度快,精度高。 使用步骤 第1步: 打开图片,打开标定工具GridCalibTool.exe, 然后选择打开一张待标定的图(CalibFiles文件夹下的500.jpg)。如下图: 第2步: 提取待标定区域(去掉多余部分,只保留网

qq_33138437的博客 1120

背包问题详解(01背包,完全背包,多重背包,分组背包)

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

走在努力路上的自己的博客 6万+

QT编程之PCM音频播放与采集

Qt5/Qt6通用方案。

深之JohnChen的专栏 1168

YOLOv11改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv11目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 3600

算法学习-背包问题

一、01背包问题 有N件物品和一个容量为V的背包。放入第i件物品花费的费用是c[i],得到的价值是w[i],求将哪些物品装入背包可使价值总和最大。 直接给出01背包问题的二维动态方程: f[i][j]=max(f[i-1][j],f[j-c[i]]+w[i]); 怎么理解呢? 想象出一个二维数组f[0…N][0…V],其中f[i][j]表示前i个物品装入背包容量为j的方案中价值最大的。那么整个问题就可以规划成很多子问题,只需要抓住关键: 1、若第i个物品无法装入(即第i个物品的容量超过了背包容量),那么

m0_52380556的博客 2875

YOLO11优化:原创自研 | 低对比度场景 | 平滑的 CIoU,对其惩罚项(中心点距离和长宽比差异)进行平滑

为了应对上述挑战,我们需要一个对边界框定位误差更具容忍度的 IoU 变体。我们的核心思想是:在 CIoU 的基础上,对其惩罚项(中心点距离和长宽比差异)进行平滑处理

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 535

经典算法精讲精练之回溯法求解0-1背包问题

最近来一波基础算法吧,掌握基础原理方可行走天下。回溯法本质是用来搜索问题的解,典型地就是使用深度优先搜索,搜索路径一般沿树形结构进行,在搜索过程中,首先会判断所搜索的树结点是否包含问题的解,如果肯定不包含,则不再搜索以该结点为根的树结点,而向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。 可能这么说不是很容易懂,咱们来的实例吧,那就是经典的0-1背包问题,...

想不出一个好的标题,就用这个吧 6918

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

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

经典算法之背包问题(0-1背包)

说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号、单价与重量如下所示: 0 李子 4KG NT$4500 1 苹果 5KG NT$5700 2 橘子 2KG NT$2250 3 草莓 1KG NT$1100

Just Do It! 5834

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

0-1背包问题经典算法(递归实现)

#include "iostream"#define CAPACITY 10#define GOODSNUM 6using namespace std;int nVol[GOODSNUM];int nValue[GOODSNUM];int knapsack(int itemIndex,int vol);void main(){ int i=0,j=0; while(i {  cou

myway88的专栏 1516

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

经典算法(2)——0/1背包问题(动态规划法)

本博客(http://blog.youkuaiyun.com/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                                                0/1背包问题                                                 1. 问题描

学习,思考,记录,分享。 8万+

C语言求解经典算法之背包问题(0-1与部分)

在 0/1 背包问题中,给定一组物品,每个物品有一个重量和一个价值,以及一个固定的背包容量,目标是选择一些物品放入背包中,使得放入的物品总重量不超过背包容量,并且所选物品的总价值最大化。解决0-1背包问题的常见方法是动态规划算法,动态规划是一种自底向上的方法,通过填充一个二维数组来解决问题,其中数组的行表示物品,列表示背包容量,每个单元格存储选择放入物品的最优价值。分数背包问题与0-1背包问题类似,但允许物品被分割成更小的部分,可以放入背包中,其价值按比例计算。

m0_61751664的博客 1044

大厂/软考经典算法:0-1背包问题 动态规划法

0-1背包问题 动态规划法动态规划背包问题0-1背包:问题描述:思路:例题解题思路 动态规划 动态规划与分治法类似,就是将一个大的问题不断的向下拆分成一些小的问题,知道拆分的小问题可以求出解,然后再将这些小问题的解向上合并,最终得到大问题的解决方案。 背包问题 背包问题是经典算法,主要有 0-1背包,普通背包(多重背包,完全背包) 一般来说0-1背包问题使用动态规划求解,使用贪心算法的无法获得最优解。 0-1背包: 问题描述: 一个旅行者有一个最多能装M公斤的背包,现在有N个物品,每件的重量分别是W1、W2

qq_33105531的博客 1890

回溯算法解决背包问题matlab实现,经典算法精讲精练之回溯法求解0-1背包问题

最近来一波基础算法吧,掌握基础原理方可行走天下。回溯法本质是用来搜索问题的解,典型地就是使用深度优先搜索,搜索路径一般沿树形结构进行,在搜索过程中,首先会判断所搜索的树结点是否包含问题的解,如果肯定不包含,则不再搜索以该结点为根的树结点,而向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。可能这么说不是很容易懂,咱们来的实例吧,那就是经典的0-1背包问题,关于这一问题后边很多算法都会涉及到...

weixin_34652580的博客 881

【数据结构】动态规划--经典算法0-1背包问题

public class DynamicPlay { public static int pack(int[] item, int n, int totalWeight) { // 申请一个状态数组 boolean[] state = new boolean[totalWeight + 1]; // 哨兵作用 state[0...

soybeen的博客 374

经典算法(2)——0/1背包问题(动态规划法)(ZZ)

             1. 问题描述                                              给定一个载重量为m,n个物品,其重量为wi,价值为vi,12. 问题分析                                        在0/1背包问题中,物体或者被装入背包,或者不被装入背包,只有两种选择。          

LamentCoder的专栏 973

经典算法问题——“0” “1”背包问题

对于“”0 “ 1”背包问题相信大家对于网上的问题一定找了很多,无非两种算法,即—— (1)方向为从上到下的进行输出的问题  (2)方向为从下到上的一次输出的问题   V为所放入的物品的价值所在    W为所放入的物品的容量      C设为背包的总容量 v1=1 v2=3 v3=5 v4=9 w1=2 w2=3 w3=4 w4=...

Mr_楠先森的博客 934

0-1背包问题经典算法(二维数组实现)

 #include "iostream"#define CAPACITY 10#define GOODSNUM 6using namespace std;void main(){ int i=1,j; int v[GOODSNUM] = {10,12,40,40,40,15}; int c[GOODSNUM] = {1,2,3,5,2,1}; int fun[GOODSNUM+1][C

myway88的专栏 914

回溯法采用的搜索策略_经典算法精讲精练之回溯法求解0-1背包问题

最近来一波基础算法吧,掌握基础原理方可行走天下。回溯法本质是用来搜索问题的解,典型地就是使用深度优先搜索,搜索路径一般沿树形结构进行,在搜索过程中,首先会判断所搜索的树结点是否包含问题的解,如果肯定不包含,则不再搜索以该结点为根的树结点,而向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。 可能这么说不是很容易懂,咱们来的实例吧,那就是经典的0-1背包问题,...

weixin_36348900的博客 244

0-1 背包问题(C++)

【代码】0-1 背包问题(C++)

2401_87285001的博客 277
上一篇: 自动生成的R.java有时不可靠
下一篇: 经典算法之图的最短路径(一):Dijkstra算法
热血大婶
博客等级 码龄16年 58粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值