数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

五大常用算法入门(一)——贪心算法 文章目录1.贪心算法简介1.1 基本定义1.2 贪心算法案例3.贪心算法的基本思路2.贪心算法最优性证明2.1 贪心算法的前提2.2 最优子结构2.3 贪心算法动态规划的区别3.贪心算法的经典问题3.1 近似解3.2 最优解参考资料 1.贪心算法简介 1.1 基本定义 在贪婪算法(greedy method) 中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,做出一个最优决策。做出决策... 阅读详情

一、背包问题描述:

有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大。


二、解决方法:

1、贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多。


举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高了~


换句话说,对于贪心算法,其核心在于设定一个标准让我们去。回到这个问题,这个标准就有三种设法了:1、价值最高的先装进背包;2、重量最低的先装进包;3、性价比(价值和重量的比值)最高的先装进背包。我在这里用的是第三种方法,用快排作了排序。


在装的过程中要注意的就是,当前物品能不能放进背包。这个是需要考虑的。因为背包问题也有好几种,如:0-1背包问题(每种物品只能拿一次)、完全背包问题(每种物品都能拿无限次)、多重背包问题(每种物品都有一定的数量可以拿)。所以在不同情况下贪心算法的一些细节设计也是不一样的,这个需要自己考虑。


2、动态规划算法:贯穿动态规划算法的就是状态状态转移方程这两个东西,而要得到这两个东西需要我们把我们的问题分解为更小的子问题,通过分析子问题去获得。这个我在LIS问题上也讲过数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法


那么回到我们这个问题,由于每次装东西进背包,我们只考虑能否装进,以及是否当前状态下的最优选择,也就是说,我们需要用背包的容量去设计一个数组,存储每一单位个容量的最大价值是多少,以此类推,获得背包容量下的最大价值是多少。这样说可能说不清楚,看看下面的代码吧~


三、代码:

1、贪心算法:

void Greedy_KnapSack(Greedy_BagPtr greedy_bags, float bagWeight){
	float temp = bagWeight;

	Quick_Sort(greedy_bags, 0, 9);

	for (int i = 9; i >= 0; --i){
		if (greedy_bags[i].weight <= temp){
			temp -= greedy_bags[i].weight;
			greedy_bags[i].resultWeight = 1;
		}
		else if (greedy_bags[i].weight > temp && temp > 0){
			greedy_bags[i].resultWeight = temp / greedy_bags[i].weight;
			temp = 0;
		}
		else if (temp < 0)
			return;
	}
}


2、动态规划算法:

int DP_KnapSack(DP_BagPtr dp_bags, int bagWeight){
	int i, size = bagWeight + 1,currentMaxValue;

	int *dp_bagweight = (int*)malloc(size*sizeof(int));

	dp_bagweight[0] = 0;

	for (i = 1; i < size; ++i){
		currentMaxValue = 0;

		if (i <= 9 && i > 0){
			for (int j = 0; j < BAGSIZE; ++j){
				if (dp_bags[j].weight == i && dp_bags[j].value > currentMaxValue)
					currentMaxValue = dp_bags[j].value;
			}

			if ((dp_bagweight[i - 1] + 1) > currentMaxValue)
				dp_bagweight[i] = dp_bagweight[i - 1] + 1;
			else
				dp_bagweight[i] = currentMaxValue;
		}
		else{
			if ((dp_bagweight[i - 1] + 1) > (dp_bagweight[9] + dp_bagweight[i % 9]))
				dp_bagweight[i] = dp_bagweight[i - 1] + 1;
			else
				dp_bagweight[i] = dp_bagweight[9] + dp_bagweight[i % 9];
		}
	}
	return dp_bagweight[bagWeight];
}

3、可能有人会需要,在解决这个问题的情况下我修改的快排

void Quick_Sort(Greedy_BagPtr bags, int start, int end){
	if (start < end){
		int i = start, j = end;
		Greedy_Bag temp = bags[start];

		while (i < j){
			while (i < j && bags[j].relativeValue >= temp.relativeValue)
				--j;
			if (i < j)
				bags[i++] = bags[j];
			while (i < j && bags[i].relativeValue < temp.relativeValue)
				++i;
			if (i < j)
				bags[j--] = bags[i];
		}
		bags[i].value = temp.value;
		bags[i].weight = temp.weight;
		bags[i].resultWeight = temp.resultWeight;
		bags[i].relativeValue = temp.relativeValue;
		Quick_Sort(bags, start, i - 1);
		Quick_Sort(bags, i + 1, end);
	}
}
Python数据结构算法——算法(贪心算法动态规划) 贪心算法动态规划(例题:找零问题、分数背包、数字拼接、活动选择,钢条切割、最长公共子序列) 阅读详情

相关推荐

MMORPG网络游戏开发之任务系统的架构设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能玩法,如何做好一个灵活可扩展的任务系统的架构设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3010

背包问题贪心算法

  贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。   贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题。贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细...

qq_38533859的博客 3万+

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 129

贪心算法解决背包问题

设有背包问题时实例n=7,m=15,(w0,w1,...,w6)=(2,3,5,7,1,4,1),物品装入背包的收益为:(p0,p1,...,p6)=(10,5,15,7,6,18,13)。先选入1号物品,再选入2号物品,但由于背包的容量剩余20-15=5,因此2号物品装入1/2,0号物品不装入,这样得到的解为(x0,x1,x2)=(0,1,1/2),它的总收益为31.5,总收益最大。贪心算法只是一种算法,它是基于贪心策略来编写的算法贪心算法可以看作是贪心策略的具象化,算法是具体的,策略是模糊的。

2301_76572283的博客 4426

背包问题算法全解析:动态规划贪心算法详解

计算机背包问题动态规划算法中的经典问题。本文将从理论实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解应用该问题。

BASK2311的博客 6459

贪心算法:部分背包问题深度解析

贪心算法是一种在每一步选择中都采取当前状态下最优(即最有利)的决策,从而希望导致结果是全局最优的算法策略

Varin 2008

贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)

哈夫曼编码的解决方案是这样的:不断找到当前出现频率最小的两个结点(字符或频率),将它们结合,作为一个新生成的结点的左右子结点,并将新生成的结点继续放入比较,直到没有落单的字符。②每次都从还未访问的顶点中选择当前巨型防护罩最近的顶点(记为Vk(0≤k≤5)),使用“爆裂模式”的能力恢复这条最近的边(并成为最小生成树中的一条边),前往访问。如果我们已知各字符在文本中的出现频率,考虑到为了让压缩后的数据更小,我们直觉是让出现频率高的字符用尽可能短的编码,而出现频率高的则可以用更长的编码。

Mrsgflmx的博客 1万+

完全背包问题贪心算法c语言,数据结构算法学习之路:背包问题贪心算法动态规划算法...

一、背包问题描述:有N种物品一个重量为M的背包,第i种物品的重量是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的费用总不超过背包重量,且价值总最大。二、解决方法:1、贪心算法贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多。举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,...

weixin_30668061的博客 1109

动态规划贪心算法

动态规划问题的第二个性质是子问题空间必须足够“小”,也就是说,问题的递归算法会求解相同的子问题,而不是一直生成新的子问题(分治法求解的问题在每一步递归都生成全新的子问题),由于子问题的求解依赖于更小的子问题的求解,我们将子问题的规模按大小排序,按由小至大的顺序进行求解,这样在求解某一个子问题时会依赖于上一个求解的子问题。两个问题都用到了子问题,而最长简单子路径的子问题是相关的,而最短路径的子问题是无关的,这里无关是指:同一个原问题的一个子问题不影响另一个子问题的解。

dzy521的博客 1万+

贪心&动态规划&回溯&分支限界,四种算法解决01背包问题,有流程图总结

01背包问题 直接copy就能当实验报告… 问题说明 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,之相对应的价值为P1,P2至Pn。采取怎样的策略能使装入背包的价值最大。 贪心算法 算法思路 ​ 计算商品的单位质量价值,并对其进行排序,在不超过背包容量的情况下,选取单位质量价值从高往低装载 流程图 算法实现 class Pack: def __init__(self, value, weight): self.value =

qq_43561370的博客 1万+

动态规划背包问题——01背包

文章目录一、01背包问题二、二维dp数组解决01背包问题1. 确定dp数组以及下标的含义2. 确定递推公式3. dp数组初始化4. 确定遍历顺序5. 举例推导dp数组三、一维dp数组解决01背包问题1. 确定dp数组以及下标的含义2. 一维dp数组的递推公式3. 一维dp数组如何初始化4. 一维dp数组遍历顺序5.举例推导dp数组四、leetcode例题讲解01背包问题416. 分割等子集1049. 最后一块石头的重量 II494. 目标474. 一背包问题中我们常见的就是01背包完全背包。在l

小朱小朱绝不认输的博客 1万+

数据结构算法贪心算法

贪心算法

世界那么大,我想去看看~【随心更新,看世界去了😄】 2400

算法数据结构】回溯算法贪心算法动态规划、图论(笔记三)

最近博主学习算法数据结构的一些视频,在这个文章做一些笔记心得,本篇文章就写了一些基础算法数据结构的知识点,具体题目解析会放在另外一篇文章。在学习时已经有C, C++的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。算法数据结构一共有三篇文章,剩余文章可以在找到。

晚安的博客 1906

贪心算法逐步优化、解决背包问题

五大算法思想: 一 贪心算法/贪婪算法 A星寻路 大问题 归纳成小问题 然后迭代,每次迭代都是解决小问题,经过无数次迭代后解决大问题 背包问题 最佳路径 能且只能做当前看来最佳的选择 如此反复 直至最终得到最优解 缺陷: 并非一定能得到整体最优解 每一步都是局部最优 花的时间一般比较少,八九不离十(整体并非最优,但也不差) ......

weixin_60569662的博客 2226

背包算法贪婪算法

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

luyuncsd123的专栏 2354

备战蓝桥——贪心算法(经典背包问题

一、前言 本人菜鸟一枚,无奈在老师的“坑蒙拐骗”之下报了2020年3月份的蓝桥杯,为了能够让成绩不太难看(主要是因为交了300报名费) 于是发奋图强,修炼内功数据结构算法 本章介绍 本章内容:我个人对贪心算法的一些认知理解。为了更生动形象的展现贪心算法,章节内使用了贪心算法的经典问题–背包问题,来理解贪心算法。 二、贪心算法背包问题介绍 1、贪心算法介绍 贪心算法(又称贪婪算法)是指,在对问...

SuperYang的博客 676

背包问题详解-动态规划

网上的背包问题已经写了很多,但是感觉不是很详细,很多细节虽然提了一下,但是没有讲透彻,因此我写下这篇笔记。

drift_along的博客 2206

背包问题1

背包问题1 Time Limit:1000MS  Memory Limit:65536K Description 一个背包容积为T(0 Input 第一行,空格间隔的两个整数TN,分别表示背包的容积物品的个数。  第二行,用空格间隔的N个整数,表示每个物品的体积。 Output 只有一行,一个整数,表示最小剩余的背包空间。 Sample Input 30 4 15

Formiko的博客 618

部分背包问题贪心算法

对于部分背包问题贪心算法是一种有效的解决策略。贪心策略的基本思想是,在每一步选择中,都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。具体到部分背包问题,贪心策略是优先选取单位重量价值(性价比)最大的物品。这里的单位重量价值是指物品的价值除以其重量。通过优先选择单位重量价值最大的物品,可以确保在每一步都尽可能增加背包的总价值。

2301_81316166的博客 1523

MacOS15+ 惠普打印机HP LaserJet Professional M1136驱动

官网HP LaserJet Professional M1136驱动,默认不支持MacOS15以上版本,本驱动为为解包后将限制版本改成16可以安装了。

上一篇: Android常见错误处理(一)
下一篇: 数据结构与算法学习之路:迷宫问题——回溯思想找出所有路径
CheeRok
博客等级 码龄13年 164粉丝 235原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值