[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;

}

相关推荐
LDG_AGI36 分钟前
【推荐系统】深度学习训练框架(八):PyTorch分布式采样器DistributedSampler原理详解
人工智能·pytorch·分布式·深度学习·算法·机器学习·推荐算法
Nebula_g3 小时前
C语言应用实例:背包DP1(Bone Collector、Piggy-Bank、珍惜现在,感恩生活)
算法
roman_日积跬步-终至千里3 小时前
【模式识别与机器学习(5)】主要算法与技术(中篇:概率统计与回归方法)之逻辑回归(Logistic Regression)
算法·机器学习·回归
Hacker_Oldv8 小时前
数据驱动的测试优化:如何利用数据提高测试效率
自动化测试·软件测试·职场和发展
Promise4858 小时前
贝尔曼公式的迭代求解笔记
笔记·算法
程序员勋勋9 小时前
高频Robot Framework软件测试面试题
测试工具·职场和发展
福尔摩斯张9 小时前
Linux进程间通信(IPC)机制深度解析与实践指南
linux·运维·服务器·数据结构·c++·算法
你好~每一天9 小时前
未来3年,最值得拿下的5个AI证书!
数据结构·人工智能·算法·sqlite·hbase·散列表·模拟退火算法
杰克尼9 小时前
3. 分巧克力
java·数据结构·算法
zmzb010310 小时前
C++课后习题训练记录Day39
数据结构·c++·算法