背包问题——动态规划

【动态规划】背包问题(详细总结,很全) 暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。 阅读详情

问题描述:背包8KG,如何装总价最多的物品。

解决:动态规划 有1~8KG负重的背包各一个,依次求每一个的最佳解,最后8KG的即为题目所要求的。

水果依次a[0] a[1] a[2] a[3] a[4] 第三行记录下标


①放李子a[0]:4KG,$4500

1KG  2KG  3KG  4KG  5KG  6KG  7KG  8KG

0        0        0       4500 4500 4500 4500 9000

-         -         -        0号    0号    0号    0号    0号*2


②放苹果a[1]:5KG,$5700

1KG  2KG  3KG  4KG  5KG  6KG  7KG  8KG

0        0        0       4500 5700 5700 5700 9000

-         -         -        0号    1号    1号    1号    0号


③放橘子a[2]:2KG,$2250

1KG  2KG  3KG  4KG  5KG  6KG  7KG  8KG

0        2250 2250 4500 5700 6750 7950 9000

-         2号    2号    0号    1号    2号    2号    0号

(4KG:2*2250<4500 ∴4500不变

    6KG:4500+2250=6750>5700

    7KG:5700+2250=7950>5700

    8KG:6750+2250<9000 ∴9000不变)


④放草莓a[3]:1KG,$1100

1KG  2KG  3KG  4KG  5KG  6KG  7KG  8KG

1100 2250 3350 4500 5700 6800 7950 9050

3号    2号    1号    0号    1号    3号    2号    3号


⑤放甜瓜a[4]:6KG,$6700

1KG  2KG  3KG  4KG  5KG  6KG  7KG  8KG

1100 2250 3350 4500 5700 6800 7950 9050

3号    2号    1号    0号    1号    3号    2号    3号


结束。

8KG:先装a[3]草莓。

8-1=7KG,看7KG的包:装a[2]橘子。

7-2=5KG,看5KG的包:装a[1]苹果。

OK

代码:

#include <stdio.h>
#include <stdlib.h>

#define LIMIT 8 // 重量限制
#define N 5 // 物品种类
#define MIN 1 // 最小重量

struct body
{
	char name[20];
	int size;
	int price;
};

typedef struct body object;
int main(void) 
{
	int item[LIMIT+1] = {0};
	int value[LIMIT+1] = {0};
	int newvalue, i, s, p;
	object a[] = {
		{"李子", 4, 4500}, // 物品名字 重量 单价
		{"苹果", 5, 5700},
		{"橘子", 2, 2250},
		{"草莓", 1, 1100},
		{"甜瓜", 6, 6700}
	};
	for(i = 0; i < N; i++)
	{
		for(s = a[i].size; s <= LIMIT; s++)
		{
			p = s - a[i].size;
			newvalue = value[p] + a[i].price;
			if(newvalue > value[s])
			{
				// 找到阶段最佳解
				value[s] = newvalue;
				item[s] = i;
			}
		}
	}
	printf("物品\t价格\n");
	for(i = LIMIT; i >= MIN; i = i - a[item[i]].size) 
	{
		printf("%s\t%d\n",
			a[item[i]].name, a[item[i]].price);
	}
	printf("合计\t%d\n", value[LIMIT]);
	return 0;
}


动态规划——分组背包问题 聪明人都会点进来学习!!动态规划看这一篇就够了!!!本文详细讲解了动态规划的核心思路(配有图片),还以经典问题——分组背包问题为例,先从基础解法开始讲解思路,再一步步优化,带有完整代码(有详细注释),对于难以理解的地方还会举例讲解,还会和01背包问题对比思考,赶紧点进来学习吧!!! 阅读详情

相关推荐

Allegro File菜单实战指南:从导入网表到导出BOM的完整流程

PCB设计离不开对EDA软件菜单体系的深入理解。在Cadence Allegro中,File菜单是数据流转的中枢,它不仅是新建、打开、保存的基础入口,更是连接原理图与版图、设计与制造的关键桥梁。工程师常遇到的“导入网表报错”“导出BOM为空”“板框不闭合”等高频问题,大多源于对File菜单中Import与Export功能的理解不到位。从基础概念出发,先厘清Import(网表、DXF、IPC)与Export(BOM、ODB++、DXF)的工作原理,再结合版本兼容、封装库路径、单位设置等工程细节,即可构建完整的

weixin_32950759的博客 298

【算法与数据结构】—— 动态规划之背包问题

背包问题分为多种,其中最常见的主要是三类:01背包、完全背包、多重背包。这里面最经典的是01背包问题,它基本上已经成为了事实上的动态规划入门级必学算法。下面,我们将对上述的三类背包问题逐个分析。

酱懵静的博客 2万+

保姆级教程:用BMS的HVIL检测电路,手把手教你排查高压互锁故障(附PWM/直流源方案对比)

本文详细解析了BMS中的HVIL检测电路,通过对比直流源与PWM两种方案,提供了一套系统化的高压互锁故障诊断流程。从电路原理到实战技巧,帮助维修人员精准定位故障根源,提升电动汽车高压系统的安全性和可靠性。

weixin_29300241的博客 392

动态规划-背包问题

动态规划 动态规划(Dynamic Programming,简称DP)动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模

weixin_41082481的博客 8660

机器人系统能用MQTT5.0代替ROS2吗?

更为灵活和友好的方案是通过把ROS(Robot Operating System)与MQTT(Message Queuing Telemetry Transport)协议相结合的解决方案,利用MQTT的轻量级、跨平台和广泛适用性特点,扩展ROS系统的通信能力,或将非ROS系统接入ROS网络。

QzmAIoT 2164

迫零均衡前与迫零均衡后眼图对比附Matlab代码

迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。

ByteSparkX的博客 459

动态规划算法:背包问题

背包问题概述背包问题概述背包问题 (Knapsack problem) 是⼀种组合优化的NP完全问题。问题可以描述为:给定⼀组物品,每种物品都有⾃⼰的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最⾼。根据物品的个数,分为如下⼏类:•01 背包问题:每个物品只有⼀个•完全背包问题:每个物品有⽆限多个•多重背包问题:每件物品最多有 si 个•混合背包问题:每个物品会有上⾯三种情况......•。

2301_79881188的博客 8955

亚马逊跨境电商选品数据分析:Python爬虫实战指南

本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。

2201_76125261的博客 299

背包问题大全(动态规划)

背包问题是动态规划非常重要的一类问题,它有很多变种,但题目万变不离其宗。我们需要抓住关键的解题思路。

weixin_45746505的博客 6万+

Python全栈入门到实战【基础篇 05】核心基础:Python的2种运行模式(交互式+命令行式)

Python代码运行模式详解:交互式与命令行式对比 摘要: Python提供两种核心运行模式:交互式(REPL)和命令行式(脚本式)。交互式模式适合快速测试语法,即时反馈结果,通过终端输入python启动,特点是无需保存、临时执行,适合验证小段代码逻辑。命令行式模式需将代码保存为.py文件后运行,适合开发完整程序,可重复执行和修改。两种模式各有优势:交互式便于学习调试,命令行式适合实际开发。掌握两种模式的使用场景和切换方法,是Python入门的关键技能,能显著提升学习效率。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4561

RK3568平台开发系列讲解(外设篇)CAN的使用

📢 本篇章带大家快速了解CAN的使用。

内核笔记 2353

动态规划——01背包问题

面向小白的动态规划之01背包问题的详细讲解

Wu_L7的博客 3万+

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 803

【动态规划】01背包问题

【动态规划】01背包问题

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 6843

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

动态规划之背包问题

0-1背包问题;完全背包问题;多重背包问题;动态规划;

rain_lin2000的博客 1519

Camera2Demo

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

动态规划之背包问题(C语言)

动态规划 动态规划(英语:Dynamic programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题 动态规划思想大致上为:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 由于通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算

一串代码的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

动态规划算法解决背包问题

什么是动态规划算法 1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 (即下一个子阶段的求解...

interesting_code的博客 4756

动态规划 背包问题

③确定转移方程:由于a[i][j]表示前i个物品中,容量为j时能够放下的最大价值,所以,如果不能够放入第i个物品,那么直接f[i,j]=f[i-1,j]即可,如果能够放下第i个物品(即j向右扫),我们只需要选择不放入第i个物品和放入第i个物品(值为恰好去掉第i个物品时的最大值+第i个物品的值)的最大值即可。一共有N个物品,有一个容量为M的背包,这N个物品,分别占用Vi的容量和具有Pi的价值,要求组合出不超过背包容量的物品,使其价值最大。子问题:从前i个物品中选,放在体积为i的背包中,总价值最大。

m0_63415841的博客 1193

c++动态规划解决01背包问题

动态规划主要运用状态转移方程(即递推方程)解决步骤问题,一般来说遍历方向有从前到后和从后到前,具体问题具体分析下面具体讲解一下动态规划的01背包问题:(一般来说,01背包问题不会刻意出题,但是会解决有限的容量中得到利益最大的一类问题)动态规划(Dynamic Programming, DP)动态规划是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。它通常用于求解最优化问题。

qq_63176310的博客 2707

c++动态规划——背包问题

问题基础:有N件物品和一个容量为C的背包。第i件物品的体积是W[i],价值是V[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。 怎样才能得到放入书包物品的的最大价值呢? 解决方法——【动态规划】 运筹学的分支,纠结决策过程最优化的数学方法 把多阶段问题分解为相互联系单一阶段小问题求解,上一阶段的决策可以对下一阶段的决策产生影响 各个阶段的决

YinghaoGuo的博客 1万+

动态规划之背包问题的Python实现

目录 1.问题描述 2.动态规划之网格法 3.python实现 1.问题描述 题目来源于《算法图解》第9章练习题9.2,如下图所示。 对于背包问题,通常的做法有列举法、贪婪算法和动态规划 (1)列举法:列举出所有的可能情况,再选择最优解,但当情况很多时,这种算法复杂度很高 (2)贪婪算法:在容量允许范围内,每次都拿剩余物品中价值最高的,贪婪算法能够快速解决复杂度很高的问题,但...

ha_____ha的博客 1395

动态规划——背包问题

#动态规划#01背包问题

2501_90864902的博客 1195

背包问题 动态规划

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

m0_53203911的博客 6432
上一篇: 三角形数
下一篇: C++ vector
tcherry
博客等级 码龄16年 46粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值