首页 > 其他分享 >DP背包-01背包

DP背包-01背包

时间:2023-10-04 16:45:20浏览次数:39  
标签:背包 int 01 maxn DP 物品 dp

背包问题-01背包

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

题目描述

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

输入格式

第一行:物品个数 \(N\) 和背包大小 \(M\)。

第二行至第 \(N+1\) 行:第 \(i\) 个物品的重量 \(W_i\) 和价值 \(D_i\)。

输出格式

输出一行最大价值。

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

  • \(dp_{i_j}=dp_{i_j-1}\) (不取)
  • \(dp_{i_j}=dp_{i_j}-w_i+d_i\) (取)

综合一下便是\(dp_{i_j}=\)\(\max\)\((dp_{i_j-1},dp_{i_j}-w_i+d_i)\)

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

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

  • \(dp_{i,j}=\max(dp_{i-1,j},dp_{i-1,j-w_{i}}+v_i)\)

综上所述

#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;
}

标签:背包,int,01,maxn,DP,物品,dp
From: https://www.cnblogs.com/2509-SYM/p/17742428.html

相关文章

  • 【做题笔记】dp,但是国庆限定版
    Day1方块消除传送门看到这个数据范围就可以猜测正解是\(O(n^4)\)的dp,与这个差不多相符合的可以想到区间dp。然后大胆猜测一下就是区间dp,令\(dp[i][j]\)表示消除掉\([i,j]\)后的最大价值,这个显然可以从长度更短的区间转移过来。所以此题我们可以从区间dp的方向思考......
  • 高维前缀和 (SOSDP)
    介绍一维前缀和:$s[i]=s[i-1]+a[i]$二维前缀和:$s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]$当然也可以这么写:for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)a[i][j]+=a[i-1][j];for(inti=1;i<=n;i++)for......
  • CVE-2010-2883 学习记录(漏洞战争,启动!)
    格式分析Header:文件头,用来注明pdf文件版本号Body:主要由组成文件的对象组成,例如图片,文字Cross-regerencetable:交叉引用表,用于存放所有对象的引用、位置偏移、字节长度,用于随机访问pdf中的任意对象Trailer:文件尾,给出交叉引用表的位置(指针)和一些关键对象的信息(指针),......
  • 系统架构设计师历年(2009-2018)论文题目
    2009论文一:论基于DSSA的软件架构设计与应用论文二:论信息系统建模方法论文三:论基于REST服务的Web应用系统设计论文四:论软件可靠性设计与应用2010论文一:论软件的静态演化和动态演化及其应用论文二:论数据挖掘技术的应用论文三:论大规模分布式系统缓存设计策略论文四:论软件可靠性......
  • 【后端开发】01-Java基础语法
    Java基础语法目录1.概述1.1.语言特性1.2.开发平台1.3.开发环境1.4.开发步骤1.5.注释2.变量与运算符2.1.关键字/保留字2.2.标识符2.3.变量2.4.常用数据类型2.4.1.基本数据类型(8种)2.4.2.引用数据类型2.4.3.数据类型转换2.5.运算符2.5.1.算术运算符(7个)2.5.2.关系运......
  • 10.4 国庆 环形dp与基环树笔记
    1.知识点环形dp环形dp的概念•环形dp与基环树在许多环形结构的问题中,我们可以在环中从某个位置把环断开,把这个环变成线性的,然后进行\(dp\)等操作。•把能通过上述操作解决的环形问题称作"可拆解的环形问题"。环形dp的两种策略•第一次在任意位置把环断开成链,按照......
  • [极客大挑战 2019]LoveSQL 1
    原理常规注入解题过程进入登录界面,还是使用万能登录试一试payload:1'or1=1#没想到成功了,说明字符型注入使用的'爆出的密码应该是MD5加密,爆破很麻烦,试试常规注入payload:1'orderby4#payload:1'orderby3#找出列项payload:1'unionselect1,database(),3#找出......
  • [极客大挑战 2019]Secret File
    原理抓包工具的使用解题过程进入靶场,什么也没看出来,老规矩查看页面源代码,发现个php文件,那就点开试试又有一个php文件,再点开却啥也没有,那就抓个包看看因为肯定发生了跳转,明明请求的是action.php却变成了end.php果然抓到了。那就继续访问secr3t.php发现了文件包含,没过......
  • [SUCTF 2019]EasySQL 1
    原理||的不同功能,连接字符串和或堆叠注入解题过程进入靶场,按常规进行注入,发现过滤了很多关键字,跑一下fuzz试试堆叠注入payload:1;showtables;得出放flag的表,但flag字段被过滤了。看wp原代码查询语句是select$_POST['query']||0fromflag;但我们不知道源码....从尝试......
  • 01 链表
    链表的基本实现与应用,差不多可以了学生通讯录管理系统#include<stdio.h>#include"stdlib.h"#include"string.h"#defineMAX10//链表typedefstructNode{intid,telenum;charname[20];intlength;structNode*next;}Node,*LinkList;......