动态规划:0-1背包问题

0-1背包问题是一种经典的动态规划问题,旨在确定在给定物品重量、价值和背包最大承重条件下,如何选取物品以最大化背包价值。通过二维或一维数组求解,关键公式为 d[i][j] = max(d[i - 1][j], d[i - 1][j - w[i]] + v[i])。二维数组方法直观,但面对大数据时空间受限,可采用一维数组空间压缩,填充过程需倒序进行。" 113677508,10295350,使用Python搭建和训练图像识别模型,"['Python', '深度学习', '模型构建', '图像处理', '机器学习']
摘要由CSDN通过智能技术生成

0-1背包问题是比较经典的动态规划,题意如下:

给定n件物品的重量和对应价值,给定一个背包的最大承重,求该背包所能装下的物品的最大价值,并输出哪几件装进了背包。

这个问题可以用一个二维数组来做,这样非常直观明了。但是有些情况下,数据过大,采用二维数组会超空间,所以需要采用一维数组进行空间压缩,复杂度是不变的,要注意的是填充一维数组时需要倒序。每次更新一遍一维数组,其实就相当于二维数组的更新。

下面是二维数组的方法,一维数组的方法在其后:

最关键的一个公式是
d[i][j] = max(d[i - 1][j], d[i - 1][j - w[i]] + v[i]);
其中,d[i][j]是指在前i件物品中,选择若干件放在承重为j的背包中,可以取得的最大价值。
先给出d[i][j]这个矩阵的示意图,因为我觉得在编程实现
过程中一直想着这个矩阵,思路会清晰很多。
这里写图片描述
这里,我统一把数组的第0个元素置为零,不使用(即:在上面的矩阵中,第0列全是0,不使用,就没有画出来。数组中的1就代表第一个)
代码如下,注释说的很清楚了:

#include <iostream>
#include<algorithm>
using namespace std;
//d[i][j]是一个矩阵,表示在前i件物品中,选择若干件放在承重为j的背包中,可以取得的最大价值
int main(){
    int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值