首页 > 其他分享 >【动态规划】背包问题----01背包

【动态规划】背包问题----01背包

时间:2022-10-01 08:11:05浏览次数:81  
标签:背包 int ---- 01 体积 数组 include

题目描述

acwing 01背包

要点

1.每件物品只能使用一次
2.总体积不超过V
3.总价值最大

分析

按照集合划分

最后一个不选 i
代表要从 1 到 i - 1 中选择物品,并且其体积不超过j,这其实就是f[i - 1][j]
最后一个选 i
如果要选i的话,我们可以这么考虑,我们先把i的这个空给空出来,那么剩下的内容就变成从1到i - 1的物品中选择物品,并且其体积不超过 j - vi(这样就是把这个i的空空出来),其总价值的最大值为f[i - 1][j - v[i]],再把i的价值加上,就得到了最后一个选i这一类的最大值f[i - 1][j - v[i]] + w[i]

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


二维写法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;
int v[N]; //体积
int w[N]; //价值
int f[N][N]; //f[i][j],j体积下前i个物品的最大价值

int main()
{
    int n, m;
    scanf ("%d%d", &n, &m);

    for (int i = 1; i <= n; i ++) scanf ("%d%d", &v[i], &w[i]);

    for (int i = 1; i <= n; i ++) 
        for (int j = 1; j <= m; j ++)
        {
            if (j < v[i]) 
                f[i][j] = f[i - 1][j];
            else 
                f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
        }

    printf ("%d\n", f[n][m]);

    return 0;
}

在上面的代码里我们可以看到

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]);

这里,推导f[i][j]的时候,我们只用到了f[i - 1]这一层的信息,所以我们可以使用滚动数组将需要用到的信息存到一维数组中。所谓滚动数组,其实也就是我计算第 i 层的数据时,使用滚动数组的内容(就是i - 1层的数据),当我计算完之后,我的数据就存进滚动数组中,这样计算 i + 1 层的时候,就可以继续使用第 i 层的数据。

【重点】由于要使用上一层的数据故需逆序


一维写法

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1010;

int v[N], w[N]; 
int f[N]; 

int main()
{
    int n, m;
    scanf ("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++) scanf ("%d%d", &v[i], &w[i]);

    for (int i = 1; i <= n; i ++)
        for (int j = m; j >= v[i]; j --)
            f[j] = max(f[j], f[j - v[i]] + w[i]);

    printf ("%d\n", f[m]);

    return 0;
}

标签:背包,int,----,01,体积,数组,include
From: https://www.cnblogs.com/LHgogo/p/16746714.html

相关文章

  • python(内置方法操作2)
    今日内容概要字典相关操作元组相关操作集合相关操作字符编码(理论)今日内容总结今天主要讲了一些昨日剩下的数据类型的内置方法以及一些相关的操作,一共有,字典。元组.......
  • win10安装mongoDB并实现远程连接
    我这里安装的是4.2mis版本1、下载(官网)[https://www.mongodb.com/try#community]2.安装前准备:建立mongoDB,作为安装目录:F:\mongoDB立data/db,用于存放数据:F:\Mong......
  • 【EF Core 6.0 】Entity Framework概要
    EntityFramework概要EntityFramework是微软的ObjectRelationalMapper(对象关系映射器),也就是我们平常说的ORM,它可以让应用程序开发者将关系型数据作为业务模型来使用,......
  • 国庆节快乐
    头一次在学校里过国庆节,不知又是何种滋味享受所以说喜迎二十大,衡实不放假.......
  • IfcContextDependentMeasure
    IfcContextDependentMeasure类型定义在交换上下文中定义的物理量的值。类型:REAL注:类型改编自ISO10303-41中定义的context_dependent_measure 。IFC1.5.1中的新类型......
  • CentOS7 docker 安装
    #查看内核版本,需要3.10以上uname-r#更新yum软件包索引yummakecachefast#卸载旧版本yumremovedocker\docker-client\......
  • NOI Online #3
    普及最急救助(红)模拟点击查看代码#include<bits/stdc++.h>#definefffflush(stdout)#definethankputs("I***thankyouccf"),ff#definebug(...)fprintf(s......
  • MyBatis接口代理对象的2种方式
    方式1使用MyBatis自带的API生成代理对象 SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession缺点:接口代理对象需要手动 getMapper() <dependen......
  • 代码随想录训练营|Day 11|Stack & Queue, 232, 225, 20, 1047
    Stack&Queue队列是先进先出栈是先进后出QUEUE在FIFO数据结构中,将首先处理添加到队列中的第一个元素。插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列......
  • 【 EF Core 6.0】DbSet与DbContext数据更新奥秘
    转载:https://www.cnblogs.com/tangge/p/4528102.htmlEFCore 6.0底层是Miscrosoft.Data.sqlite。5.6.4《DbSet与DbContext》介绍DbSet与DbContext中的核心属性及重......