DP背包-01背包

背包问题-01背包

首先我们要明白什么是01背包,在下述例题中,由于每个物体只有两种可能的状态(取与不取),对应二进制中的 01,这类问题便被称为「0-1 背包问题」

题目描述

N 件物品和一个容量为 M 的背包。第 i 件物品的重量是 Wi,价值是 Di。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

输入格式

第一行:物品个数 N 和背包大小 M

第二行至第 N+1 行:第 i 个物品的重量 Wi 和价值 Di

输出格式

输出一行最大价值。

我们可以设状态dpi,j为在能放前n个的前提下,容量为j的背包所能达到的最大值。
我们在对于第i个物品时,有以下两个选则:

  • dpij=dpij1 (不取)
  • dpij=dpijwi+di (取)

综合一下便是dpij=max(dpij1,dpijwi+di)

这里如果直接采用二维数组对状态进行记录,会出现 MLE。可以考虑改用滚动数组的形式来优化。

因为对dpi影响的只有dpi1,可以去掉第一维,直接用 dpi 来表示处理到当前物品时背包容量为 i 的最大价值,得出以下方程:

  • dpi,j=max(dpi1,j,dpi1,jwi+vi)

综上所述

#include <iostream>
using namespace std;
const int maxn = 13010;
int n, W, w[maxn], v[maxn], f[maxn];

int main() {
  cin >> n >> W;
  for (int i = 1; i <= n; i++) cin >> w[i] >> v[i];  // 读入数据
  for (int i = 1; i <= n; i++)
    for (int l = W; l >= w[i]; l--)
      if (f[l - w[i]] + v[i] > f[l]) f[l] = f[l - w[i]] + v[i];  // 状态方程
  cout << f[W];
  return 0;
}
posted @   To_Carpe_Diem  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示