首页 > 其他分享 >01背包详解

01背包详解

时间:2023-01-02 17:55:12浏览次数:53  
标签:01 read 件物品 ll 背包 体积 物品 详解

01背包

题目描述

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

  • 0<N,V≤1000
  • 0<vi,wi≤1000

题解:

首先这是思路:

image

  1. 表示状态

    f[i][j]表示只考虑前 i 个物品,总共体积为 j 时的最大价值。

  2. 循环范围

    i 表示物品数量,物品最少 1 个,物品最多 n 个,因此 i 的循环范围是 1~n 。
    j 表示总共体积,体积最小是 0 ,体积最大是 V ,因此 j 的循环范围是 0~V 。

  3. 状态转移

    由于每个状态是由前一个状态推来的,所以要决定当前物品是选还是不选。
    如果选这个物品不优,那么就不选它,所以每个状态一定不会比之前的任何一个状态更差。
    然后可以得出:

    如果不选当前物品,则价值为f[i-1][j]

    如果选当前物品:
    要给这个物品在 j 个单位的空间中腾出位置,还得保证留下的物品时最优的。
    留下的物品的总价值就存在f[i-1][j-v[i]]
    最后,还要加上选中物品的价值w[i]
    综上所述,如果选当前物品,则价值为f[i-1][j-v[i]]+w[i]

    然后求出它们的较大值,存在f[i][j]
    现在可以列出转移方程:

    f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);

    有这样一个公理:只要每一步都是当前最优的,那结果一定是最优的。

有了这些,就可以打出code:

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define N 1005
using namespace std;
inline ll read()
{
	ll x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-f;c=getchar();}
	while(isdigit(c)){x=x*10+c-48;c=getchar();}
	return (f==1)?x:-x;
}//卡长
ll n=read(),V=read(),v[N],w[N],f[N][N];
int main()
{
	for(ll i=1;i<=n;i++) v[i]=read(),w[i]=read();
	for(ll i=1;i<=n;i++)
	{
	    for(ll j=0;j<=V;j++)
	    {
	        f[i][j]=f[i-1][j];
	        if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
	    }//判断j是否不小于v[i],如果小于就肯定不能选当前物品,则f[i][j]=f[i-1][j]
	}
	cout << f[n][V];
	return 0;
}

标签:01,read,件物品,ll,背包,体积,物品,详解
From: https://www.cnblogs.com/wangxuzhou-blog/p/17020286.html

相关文章

  • jsdemo01.html
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scripttype="text/javascript">varx;......
  • buuoj-pwn-hctf2018_the_end
    buuoj-pwn-hctf2018_the_end总结lb=ELF(...)使用重温了一遍攻击exit指针,还有如何找__libc_atexit虽然改不了反弹shell重定向​ 详细看这个exec1>&0_luooofa......
  • day01
    MarkDown一级标题#+空格标题二级标题##+空格字体helloworld****加粗helloworldhelloworld**斜体helloworld斜体+加粗******helloworldhelloworld......
  • NepnepxCATCTF-CatPaw详解
    小米备份文件,可以用7zip打开得到apk对apk进行分析,跳转到加密代码,通过分析代码,发现只需要最后的md5值和8b9b0ad9c324204fac87ae0fc2c630bd相等即可同时资源中又发现pas......
  • bbs项目day01---注册登录
    今日内容概要主题:仿BBS项目项目开发基本流程项目分析(表)项目注册功能项目登录功能今日内容详细项目开发基本流程1.需求分析2.架构设计3.分组开发4.提交测......
  • Python类与对象详解
    一、类和对象类的意思:种类、分类、类别对象是特征与技能的结合体,我可能有身高体重、而你也有身高体重,所以你会说你像我,但是你一定不会说你像阿猫阿狗。并且我和你其实就......
  • 【Java自动化测试】-Mock操作详解
    一、moco框架下载地址:https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/1.3.0/moco执行:java-jar./moco-runner-1.3.0-standalone.jarhttp-p8888......
  • 开发板测试手册——系统启动、文件传送操作步骤详解(1)
    目录前言41评估板快速测试51.1系统启动测试51.2文件传送测试111.2.1通过Linux系统启动卡111.2.2通过OpenSSH121.3LED测试151.4KEY测试151.......
  • 嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(3)
    目录4matrix_demo案例274.1HLS工程说明274.2编译与仿真304.3综合314.4IP核测试364.4.1PL端IP核测试Vivado工程说明374.4.2PS端IP核测试裸......
  • Linux 应用案例开发手册——基于Zynq-7010/20工业开发板
    目录1开发案例说明42Linux常用开发案例42.1tl_led_flash案例42.2tl_key_test案例72.3tl_can_echo案例112.4tcp_udp_demos案例173Python开发案......