[leetcode]01背包问题

一.问题描述

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

}

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

cin >> valuej;

}

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

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

// 初始化, 因为需要用到dpi - 1的值

// j < weight0已在上方被初始化为0

// j >= weight0的值就初始化为value0

for (int j = weight0; j <= bagweight; j++) {

dp0j = value0;

}

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

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

if (j < weighti) dpij = dpi - 1j; // 如果装不下这个物品,那么就继承dpi - 1j的值

else {

dpij = max(dpi - 1j, dpi - 1j - weight\[i] + valuei);

}

}

}

cout << dpn - 1bagweight << endl;

return 0;

}

相关推荐
金幄科技25 分钟前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲30 分钟前
Linux学习笔记:文件IO
linux·笔记·学习·算法
lhldsg1 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY1 小时前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh1 小时前
百日算法修炼 · Day 17
数据结构·算法
XUEYUAN52121 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
sel_92 小时前
【多轮对话论文导读(七)】多轮对话论文阅读笔记:从数据生成、用户模拟到上下文重构与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·语言模型·自然语言处理
远游客07132 小时前
为什么用「年×100+月」做比较
算法·gin
leavesleo2 小时前
DeepSeek 偷偷给你取外号?拆一下 AI 人格化背后的技术
算法
liliangcsdn3 小时前
skewness收益偏度取负因子背后逻辑的探索
人工智能·算法·机器学习