【动态规划法】求解0/1背包问题

article/2025/9/29 19:59:47

问题描述

有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10,计算背包所能装入物品的最大价值。

求解思路

  在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。根据问题的要求,有如下约束条件和目标函数:
在这里插入图片描述
在这里插入图片描述
  于是,问题归结为寻找一个满足约束条件式1,并使目标函数式2达到最大的解向量X=(x1, x2, …, xn)。
  0/1背包问题可以看作是决策一个序列(x1, x2, …, xn),对任一变量xi的决策是决定xi=1还是xi=0。按下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;依此类推,直到第n个阶段。

实现过程

  决策序列(x1, x2, …, xn),对任一变量xi的决策是决定xi=1还是xi=0。在对xi-1决策后,已确定了(x1, …, xi-1),在决策xi时,第i个物品则会有以下两种情况:
(1)如果第i个物品没有装入背包,则背包中物品的价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。
(2)如果把第i个物品装入背包,则背包中物品的价值等于把前i-1个物品装入容量为j-wi的背包中的价值加上第i个物品的价值vi。
  设V(n, C)表示将n个物品装入容量为C的背包获得的最大价值,显然,初始子问题是把前面i个物品装入容量为0的背包和把0个物品装入容量为j的背包,得到的价值均为0,即:
V(i, 0)= V(0, j)=0 (0≤i≤n, 0≤j≤C)
  考虑原问题的一部分,设V(i, j)表示将前i(1≤i≤n)个物品装入容量为j(1≤j≤C)的背包获得的最大价值,在决策xi 时,可采用递推式:
在这里插入图片描述
得到如下动态规划函数:V(i, 0)= V(0, j)=0
在这里插入图片描述
第二个式子表明:如果第i个物品的重量小于背包的容量,则会有以下两种情况:
(1)如果第i个物品没有装入背包,则背包中物品的价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。
(2)如果把第i个物品装入背包,则背包中物品的价值等于把前i-1个物品装入容量为j-wi的背包中的价值加上第i个物品的价值vi;
显然,取二者中价值较大者作为把前i个物品装入容量为j的背包中的最优解。
在每个阶段的决策中,始终保持当前所完成的决策(序列)使得背包的价值是最大的。
根据动态规划函数,用一个(n+1)×(C+1)的二维表V,V[i][j]表示把前i个物品装入容量为j的背包中获得的最大价值。
在这里插入图片描述

代码实现

#include<iostream>
using namespace std;#define C 10
int V[6][11];
int x[5];
int KnapSack(int n, int w[], int v[]);
int max(int x, int y);
void printV();
int main()
{int w[] = { 2, 2, 6, 5, 4 };int v[] = { 6, 3, 5, 4, 6 };cout << "背包的最大价值为:" << KnapSack(5, w, v) << endl;cout << "装入背包的物品是:";for (int i = 0; i < 5; i++){if (x[i]==1){cout << "物品" << i + 1;}}printf("\n");printV();cout << endl;return 0;
}int max(int x, int y){if (x>y){return x;}else{return y;}
}int KnapSack(int n, int w[], int v[]){int i, j;//1.初始化第0列for ( i = 0; i <=n; i++){V[i][0] = 0;}//2.初始化第0行for ( j = 0; j <=C; j++){V[0][j] = 0;}//3.初始化第i行,进行i次迭代for (i = 1; i <=n; i++){for ( j = 1; j <= C; j++){if (j<w[i-1]){//第j个物品重量大加不进去V[i][j] = V[i - 1][j];}else{V[i][j] = max(V[i - 1][j], V[i-1][j-w[i-1]]+v[i-1]);}}}//4.求装入的物品for ( j = C,i=n; i>0; i--){if (V[i][j]>V[i-1][j]){x[i-1] = 1;j = j - w[i-1];}else{x[i-1] = 0;}}//5.返回背包的最大价值return V[n][C];
}void printV(){for (int i = 0; i < 6; i++){for (int j = 0; j < C+1; j++){if (j==0){printf("%d\t", i);}else{printf("%d\t", V[i][j - 1]);}}printf("\n");}
}

运行结果

在这里插入图片描述
这个问题也就总结到这里,如果有什么问题的话,欢迎各位联系我~


http://chatgpt.dhexx.cn/article/XkyFlqtw.shtml

相关文章

算法设计之动态规划法

算法设计之动态规划法 一、目的二、内容1.斐波那契数列①自底向上分析解决 ②自顶向下分析解决 2.走棋盘问题分析解决 3.爬台阶问题分析解决 三、反思与总结 一、目的 1.理解动态规划法的特征(多阶段决策\最优子结构\无后效性\子问题重复) 2.理解动态规划法的求解(划分过程\逆…

【动态规划法】求解TSP问题

问题详情 求解下图所示的TSP问题&#xff0c;计算出所经过的城市编号以及最短路径值&#xff0c;城市代价矩阵如图所示&#xff1a; 求解思路 假设从顶点i出发&#xff0c;令d(i, V’ )表示从顶点i出发经过V’ 中各个顶点一次且仅一次&#xff0c;最后回到出发点&#xff08;…

动态规划法求解0/1背包问题

一、求解0/1背包问题 1、问题描述 有n个重量分别为{w1&#xff0c;w2&#xff0c;…&#xff0c;wn}的物品&#xff0c;它们的价值分别为{v1&#xff0c;v2&#xff0c;…&#xff0c;vn}&#xff0c;给定一个容量为C的背包。 设计从这些物品中选取一部分物品放入该背包的方案&…

动态规划法——多段图的最短路径

目录 动态规划法的基本思想 多段图的基本想法 代码块&#xff08;Java&#xff09; 运行结果 动态规划法的基本思想: 将大问题划分成若干个小问题进行解决&#xff0c;从而一步步获取最优解动归从上到下分析问题&#xff0c;从下到上解决问题动归与分治法相似&#xff0c;其…

强化学习——动态规划法

文章目录 前言一、动态规划法简单认识1.基本概念2.适用情况3.求解步骤4.典型案例二、值函数1.累计折扣奖励2.状态值函数3.动作值函数4.状态值函数与动作值函数的关系5.贝尔曼方程&#xff08;动态规划法核心&#xff09; 三、策略评估1.基于状态值函数评估策略2.基于动作值函数…

南邮|算法分析与设计实验二 动态规划法

目录 实验目的 实验内容 实验步骤 一、最长公共子序列 二、矩阵连乘 实验目的 加深对动态规划法的算法原理及实现过程的理解&#xff0c;学习用动态规划法解决实际应用中的最长公共子序列问题和矩阵连乘问题&#xff0c;体会动态规划法和备忘录方法的异同。 实验内容 …

动态规划--算法

1、动态规划&#xff1a;将求解问题分解成若干个子问题&#xff0c;求解子问题&#xff0c;这些子问题不是独立的 求解后的子问题都会记录到表中&#xff0c;每个子问题仅求解一次&#xff0c; 下次遇到这些子问题直接取解 自底向上的方式计算最优解 2、最优子结构&#xff…

TSP问题,动态规划法

TSP问题是指旅行家要旅行n个城市&#xff0c;要求各个城市经历且仅经历一次然后回到出发城市&#xff0c;并要求所走的路程最短。各个城市间的距离可以用代价矩阵来表示。 假设从顶点i出发&#xff0c;令d(i, V)表示从顶点i出发经过V中各个顶点一次且仅一次&#xff0c;最后…

动态规划法的基本知识

一、动态规划方法相关概念 1、20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时&#xff0c;提出了著名的最优性原理(principle of optimality),同时&#xff0c;把多阶段过程转化为一系列单阶段问题&#xff0c;利用各阶…

动态规划法及其优化

在很多问题中&#xff0c;动态规划算法是我们的最优选择&#xff0c;比起递归算法&#xff0c;动态规划算法的时间复杂度和空间复杂度都更加优越&#xff0c;可以处理的数据规模更大。但是&#xff0c;动态优化算法的时间复杂度为O&#xff08;N*V&#xff09;&#xff0c;也就…

算法设计与分析之动态规划法

文章目录 前言一、动态规划法概述二、动态规划法设计思想三、动态规划法的基本要素四、动态规划算法的设计步骤五、动态规划法与分治法六、动态规划法与贪心法七、动态规划法示例总结 前言 大家好&#xff0c;我是一只勤勤恳恳的程序猿。本篇文章小猿将跟您分享算法设计与分析中…

算法-动态规划法

动态规划是在20世纪50年代由美国数学家贝尔曼为研究最优控制问题而提出的&#xff0c;当该方法在应用数学中的价值被大家认同以后&#xff0c;在计算机学界&#xff0c;动态规划法成为一种通用的算法设计技术用来求解多阶段决策最优化问题。 所以&#xff0c;同学们&#xff0…

动态规划算法

一 动态规划算法 动态规划(Dynamic Programming)算法的核心思想是&#xff1a;将大问题划分为小问题进行解决&#xff0c;从而一步步获取最优解的处理算法。 动态规划算法与分治算法类似。其基本思想也是将待求解问题分解成若干个子问题&#xff0c;先求解子问题&#xff0c;…

经典中的经典算法:动态规划(详细解释,从入门到实践,逐步讲解)

动态规划的重要性就不多说,直接进入正题 首先,我们看一下官方定义:定义: 动态规划算法是通过拆分问题&#xff0c;定义问题状态和状态之间的关系&#xff0c;使得问题能够以递推&#xff08;或者说分治&#xff09;的方式去解决。 动态规划算法的基本思想与分治法类似&#xf…

目标检测中的多尺度特征结合方式

目录 简述 解构物体检测各个阶段 FPN的演进 1&#xff09;无融合 2&#xff09;自上而下单向融合 a&#xff09;Faster/Master/Cascade RCNN中的FPN b&#xff09;RetinaNet中的FPN c&#xff09;Yolov3中的FPN 3&#xff09;简单双向融合 4&#xff09;复杂的双向融…

总结-CNN中的目标多尺度处理

Fly-AI竞赛服务平台 flyai.com 在开始学习之前推荐大家可以多在 FlyAI竞赛服务平台多参加训练和竞赛&#xff0c;以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例&#xff0c;支持算法能力变现以及快…

【MFEN:轻量级多尺度特征提取:SR网络】

MFEN: Lightweight multi-scale feature extraction super-resolution network in embedded system &#xff08;MFEN&#xff1a;嵌入式轻量级多尺度特征提取超分辨率网络&#xff09; 深度卷积神经网络&#xff08;CNN&#xff09;在超分辨率&#xff08;SR&#xff09;方面…

深度学习笔记---多尺度网络结构归类总结

目录 1.什么是图像金字塔 1.1 高斯金字塔 ( Gaussian pyramid): 1.2 拉普拉斯金字塔&#xff08;Laplacian pyramid&#xff09; 1.3 DOG金字塔 2. 多尺度网络&#xff08;MTCNN&#xff09; 2.1 多尺度输入网络 2.2 多尺度特征融合网络 2.2.1 并行多分支网络 2.2.2 串行…

【边缘注意:深度多尺度特征】

Learning a Deep Multi-Scale Feature Ensemble and an Edge-Attention Guidance for Image Fusion &#xff08;学习深度多尺度特征集成和图像融合的边缘注意指南&#xff09; 在本文中&#xff0c;我们提出了一种用于红外和可见光图像融合的深度网络&#xff0c;该网络将具…

多尺度特征的提取

1、图像金字塔 将图片进行不同尺度的缩放&#xff0c;得到图像金字塔&#xff0c;然后对每层图片提取不同尺度的特征&#xff0c;得到特征图。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低&#xff0c;且来源于同一张原始图的图像集合。其通过梯次向下采样获得&…