有依赖的背包详解以hdu3449为例

2023-05-16

二维数组(好理解,一组物品等于上一组的前提上最优解再取最优解,然后在更新最优解),这里dp[i][j]是指前i件物品在花j元时能得到的最大价值

其中

先把主件分离

即价值 比主件还小的部分封闭起来。

  for(j=0;j<bc;j++)
                dp[i][j]=-1;

然后将可以装物品的部分赋予上一次的最优解(每一次都要做一次更新,继承上一次的最优解)

 for(j=bc;j<=m;j++)
                dp[i][j]=dp[i-1][j];

将一组物品做01背包

 for(j=0;j<bn;j++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                for(int k=m;k>=a;k--)
                {
                    if(dp[i][k-a]!=-1)
                    dp[i][k]=max(dp[i][k],dp[i][k-a]+b);
                }
            }

最后再将这组物品和上组物品的最优解再做一次比较,取最优。(这一步主要是看比这次盒子价值还低的部分的最优解)

  for(j=m;j>=0;j--)
            dp[i][k]=max(dp[i-1][j],dp[i][j]);

完整代码

#include<bits/stdc++.h>
using namespace std;
int dp[51][100005];
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        int i,j;
        for(i=1;i<=n;i++)
        {
            int bc,bn;
            scanf("%d%d",&bc,&bn);
            for(j=0;j<bc;j++)
                dp[i][j]=-1;
            for(j=bc;j<=m;j++)
                dp[i][j]=dp[i-1][j];
            for(j=0;j<bn;j++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                for(int k=m;k>=a;k--)
                {
                    if(dp[i][k-a]!=-1)
                    dp[i][k]=max(dp[i][k],dp[i][k-a]+b);
                }
            }
           
            for(j=m;j>=0;j--)
            dp[i][k]=max(dp[i-1][j],dp[i][j]);
            
        }
        printf("%d\n",dp[n][m]);
    }
}

一维数组(要用到两个一维数组)

这里的f数组是用来看没有主件时(就相当于把主件看成了空气)花费各种费用能得到的最大价值,dp数组是加上主件后能得到的最大值。

首先,f要继承dp,为什么一个不包括主件的要继承有主件的呢,原因在于f是包含前i个所有组的最优解,因此他需要前面的数组把主件加上,这样才方便一层层找最优

 memcpy(f,dp,sizeof(f));

然后求没有主件的01背包

for(j=0;j<bn;j++)
            {
                int a,b;
                scanf("%d%d"&a,&b);
                for(j=m-bc;j>=a;j--)
                    f[j]=max(f[j],f[j-a]+b);
            }

最后在把主件加上得dp数组

for(j=bc,j<=m;j++)
                dp[j]=max(dp[j],f[j-bc]);

完整代码

#include<bits/stdc++.h>
using namespace std;
int dp[100005];
int f[100005];
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        int i,j;
        for(i=1;i<=n;i++)
        {
            int bc,bn;
            scanf("%d%d",&bc,&bn);
            memcpy(f,dp,sizeof(f));
            for(j=0;j<bn;j++)
            {
                int a,b;
                scanf("%d%d"&a,&b);
                for(j=m-bc;j>=a;j--)
                    f[j]=max(f[j],f[j-a]+b);
            }
            for(j=bc,j<=m;j++)
                dp[j]=max(dp[j],f[j-bc]);
        }
     printf("%d\n",dp[m]);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有依赖的背包详解以hdu3449为例 的相关文章

随机推荐

  • 重置Linux虚拟机密码

    重置Linux虚拟机密码 进入设置页面 通过键盘 按钮选中第一个 xff0c 按 e 键 设置页面 同样使用 键找到 ro xff08 注意 xff1a 是换行的意思 xff0c 所以有可能是 ro r o ro 的样子 xff0c 找第一
  • python如何打包,实现pip install

    目录 官方地址打包流程创建pyproject toml xff08 可选 xff09 配置元数据静态源数据动态源数据 xff08 如果包含该文件 xff0c 即使没有参数也要调用setup xff09 创建README md 安装软件包方式
  • 单片机c语言数字计数程序,如何使用单片机制作一个手动计数器

    1 xff0e 实验任务 利用AT89S51单片机来制作一个手动计数器 xff0c 在AT89S51单片机的P3 7管脚接一个轻触开关 xff0c 作为手动计数的按钮 xff0c 用单片机的P2 0 xff0d P2 7接一个共阴数码管 x
  • 在linux中nano的含义,详解linux中nano命令

    nano是一个字符终端的文本编辑器 xff0c 有点像DOS下的editor程序 它比vi vim要简单得多 xff0c 比较适合Linux初学者使用 某些Linux发行版的默认编辑器就是nano nano命令可以打开指定文件进行编辑 xf
  • mysql 客户端 ssl_如何为MySQL服务器和客户机启用SSL?

    你只要查看MySQL错误日志文件 比如 var log mysql mysql log xff0c 就可以检查SSL配置有没有问题 要是错误日志中没有警告或错误 就像下面的屏幕截图 xff0c 这表明SSL配置没有问题 验证SSL配置的另一
  • java project怎么运行_github上的java项目怎么运行(面向小白)

    前言 今天从github把我以前写的一个小demo下载下来了 xff0c 第一次下载项目 xff0c 摸索了一个多小时 xff0c 才运行起来 下载有两种方法 xff0c 通过git下载 xff0c 或者直接压缩包下载 xff0c 本文选的
  • 虚拟环境中调用python版本问题

    一觉醒来 xff0c 发现原本在虚拟环境里使用python xxx py xff0c 所有原本安装好的包都无法调用了 于是开始debug xff1a 进入配置好的虚拟环境env name xff0c 检查一下sys path中保存的库的路径
  • linux rust语言自定义安装

    rust语言linux自定义安装 1 下载rustup init进程2 修改安装的环境变量 xff0c centos 3 配置cargo镜像源 xff08 解决cargo build无法下载依赖包 xff09 span class toke
  • 刚入门数据分析的一些经验分享

    最近刚刚写了我人生当中的第一篇分析报告 xff0c 遇到了一些坑和大家分享一下 xff0c 尤其是像我这样没有任何经验的 xff0c 应该还是会有一定的好处 行文需要注意的地方 1 文字务必是客观陈述 xff0c 不要做一些猜测性的描述 x
  • Centos7.9开启iptables服务方法

    今天小李在一台 CentOS 的服务器上新增 iptables 规则时 xff0c 使用 service iptables save 命令保存时 xff0c 报错 The service command supports only basi
  • C++字符串string拼接

    描述 C 43 43 语言string类型的拼接 代码 span class token macro property span class token directive keyword include span span class t
  • 出现错误dpkg: 处理软件包 shim-signed (--configure)时出错:

    输入下面命令进行升级 xff1a span class token function sudo span span class token function apt get span upgrade 出现下面问题 xff1a 升级了 spa
  • python包对象模块的区别

    https www cnblogs com kex1n p 5977051 html
  • 运行时间的要求

    在竞赛中 xff0c 一般算机一秒能运行5 x 10 8次汁算 xff0c 一般 O n 的算法数据范围n lt 10 8 O n logn 的算法数据范围n lt 61 10 6 O n sqrt n 的算法数据范围n lt 10 5 O
  • vector利用swap()函数进行内存的释放,防止爆内存

    vector利用swap 函数进行内存的释放 首先 xff0c vector与deque不同 xff0c 其内存占用空间只会增长 xff0c 不会减小 比如你首先分配了10 000个字节 xff0c 然后erase掉后面9 999个 xff
  • 计算质因子只有2,3,5,7的数的因子有几个

    题目 一个只有2 3 5或7的质数的数被称为一个不起眼的数 第1 2 3 4 5 6 7 8 9 10 12 14 15 16 18 20 21 24 25 27 显示前20个不起眼的数字 现在给出一个简单的数字 xff0c 请编写一个程序
  • Python3和Python2关于csv文件的读写区别

    今天在处理数据的时候遇到了一个因为python版本不同 xff0c 导致csv读写出错的问题 我首先在Python 2 7的环境下抽取特征 xff0c 按照一定的格式存成csv文件 xff1a span class token keywor
  • 容器注意有的不能对迭代器进行加减法

    能进行算术运算的迭代器只有随即访问迭代器 xff0c 要求容器元素存储在连续内存空间里 xff0c vector xff0c string xff0c deque的迭代器是有加减法的 xff0c 但是map xff0c set xff0c
  • String字符串与字符(char类型)数组互相转换

    java 主要是两个方法 xff1a 1 String类的toCharArray 方法 xff0c 将字符串转为字符 char 数组 String ss 61 abc char cc cc 61 ss toCharArray 这时cc 61
  • 有依赖的背包详解以hdu3449为例

    二维数组 xff08 好理解 xff0c 一组物品等于上一组的前提上最优解再取最优解 xff0c 然后在更新最优解 xff09 xff0c 这里dp i j 是指前i件物品在花j元时能得到的最大价值 其中 先把主件分离 即价值 比主件还小的