[leetcode]01背包问题

一.问题描述

01背包问题是一个经典的组合优化问题,属于动态规划算法的典型应用场景。其问题描述如下: 有一个容量为C的背包,以及 n 个物品,每个物品都有重量w[i] 和价值 v[i]。要求在有限的背包容量下选择一些物品放入背包,使得放入背包的物品总价值最大,且放入物品的总重量不能超过背包的容量。同时,对于每个物品,只能选择放入背包或者不放入背包,即每个物品只有两种状态,这也是"01"背包名称的由来。

例如,有一个容量为5的背包,有3个物品,分别是重量为2、价值为3的物品1,重量为3、价值为4的物品2,以及重量为1、价值为2的物品3。如何选择物品放入背包,才能使背包内物品的总价值最大呢?这就是01背包问题需要解决的。

Coding:

#include <bits/stdc++.h>

using namespace std;

int main()

{

int n, bagweight;// bagweight代表行李箱空间

cin >> n >> bagweight;

vector<int> weight(n, 0); // 存储每件物品所占空间

vector<int> value(n, 0); // 存储每件物品价值

for (int i = 0; i < n; ++i) {

cin >> weight[i];

}

for (int j = 0; j < n; ++j) {

cin >> value[j];

}

// dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值

vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));

// 初始化, 因为需要用到dp[i - 1]的值

// j < weight[0]已在上方被初始化为0

// j >= weight[0]的值就初始化为value[0]

for (int j = weight[0]; j <= bagweight; j++) {

dp[0][j] = value[0];

}

for (int i = 1; i < weight.size(); i++) { // 遍历科研物品

for (int j = 0; j <= bagweight; j++) { // 遍历行李箱容量

if (j < weight[i]) dp[i][j] = dp[i - 1][j]; // 如果装不下这个物品,那么就继承dp[i - 1][j]的值

else {

dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

}

}

}

cout << dp[n - 1][bagweight] << endl;

return 0;

}

相关推荐
杨连江几秒前
原子级平面限域协同晶核诱导定向生长单层鳞片石墨的研究
算法
MATLAB代码顾问6 分钟前
混合粒子群-模拟退火算法(HPSO-SA)求解作业车间调度问题——附MATLAB代码
算法·matlab·模拟退火算法
Felven10 分钟前
C. Prefix Min and Suffix Max
算法
加农炮手Jinx11 分钟前
LeetCode 26. Remove Duplicates from Sorted Array 题解
算法·leetcode·力扣
加农炮手Jinx11 分钟前
LeetCode 88. Merge Sorted Array 题解
算法·leetcode·力扣
格林威11 分钟前
线阵工业相机:如何计算线阵相机的行频(Line Rate)?公式+实例
开发语言·人工智能·数码相机·算法·计算机视觉·工业相机·线阵相机
yueyue54314 分钟前
透过现象看本质:以fast_lio架构的整套算法的局部避障改为TEB算法为例深度探讨——如何成为一个合格的算法架构师?
算法·架构
梨花爱跨境14 分钟前
红人视频×A10算法:亚马逊转化率与流量闭环实战
算法
阿Y加油吧19 分钟前
二刷 LeetCode:75. 颜色分类 & 31. 下一个排列 复盘笔记
笔记·算法·leetcode
风筝在晴天搁浅20 分钟前
LeetCode 378.有序矩阵中第K小的元素
算法·矩阵