背包

2023-10-27

01背包

问题描述

有N件物品和一个容量为V的背包。第i件物品的体积是weight[i],价值是value[i]。求解将哪些物品装入背包可使价值总和最大。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=100;
int weight[Maxsize];//每个物品的重量
int value[Maxsize];//每个容量的价值
int s[Maxsize];//每个状态的最大价值
int n;//物品的个数
int v;//背包容量

void dp(){
    for(int i=0;i<n;i++){
        for(int j=v;j>=weight[i];j--){
            s[j]=max(s[j],s[j-weight[i]]+value[i]);
        }
    }
}

int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        scanf("%d%d",&weight,&value);
    }
    dp();
    printf("%d",s[v]);
    return 0;
}

完全背包

问题描述

有N种物品和一个容量为V的背包,每种物品都有无限件可用。

第i种物品的体积是w,价值是v。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int weight[Maxsize];//每个物品的重量
int value[Maxsize];//每个武平的价值
int s[Maxsize];//每个状态的最大值
int n;//物品的个数
int v;//背包的容量

void dp(){
    for(int i=0;i<n;i++){
        for(int j=v-w[i];j<=v;j++)
            s[j]=max(s[j],s[i-w[i]])
    }
}

int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        scanf("%d%d",&weight[i],&value[i]);
    }
    dp();
    printf("%d",s[v]);
    return 0;
}

分组背包

问题描述

有容积为V的背包,有n件物品,每种物品属于的组别不同,t为最大的组数,每组中的物品相互冲突,所以只能选其中一件接下来是每件物品的重量w[i],价值v[i],以及组号x,求最大的价值.

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int weight[Maxsize][Maxsize];//每个组的每个物品的重量
int value[Maxsize][Maxsize];//每个组的每个物品的价值
int s[Maxsize];//每个状态的最大价值
int t;//分组个数
int n;//物品个数
int v;//背包容量

void dp(){
    for(int i=1;i<=t;i++){
        for(int k=v;k>=1;k--)
            for(int j=1;j<=weight[i][0];j++)
                if(k>=weight[i][j])
                    s[k]=max(s[k],s[k-weight[i][j]]+value[i][j]);
    }
}

int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        int g,x,y;
        scanf("%d%d%d",&g,&x,&y);
        weight[g][0]++;//记录每个组的物品数量
        value[g][0]++;
        weight[g][weight[g][0]]=x;
        value[g][value[g][0]]=y;
    }
    dp();
    printf("%d",s[t]);
    return 0;
}

混合背包

问题描述

有一个体积为V的背包,有m种物品,每种物品有体积和价值,且数量一定。求背包能装下的最大价值。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int weight[Maxsize];//每个物品的重量
int value[Maxsize];//每个物品的价值
int num[Maxsize];//每个物品的数量
int s[Maxsize];//每个状态的最大值
int n;//物品种数
int v;//背包容量

void dp(){
    for(int i=0;i<n;i++){
        if(num[i]==1)
            for(int j=v;j>=v-weight[i];j--){
                s[j]=max(s[j],s[j-weight[i]]+value[i]);
         else if(num[i]<=(v/weight[i]))
             for(int j=v;j>=1;j--)
                 for(int k=0;k<=num[i];k++)
                     if(j>=k*weight[i])
                         s[i]=max(s[j],s[j-k*weight[i]]+k*value[i]);
         else
             for(int j=v-weight[i];j<=v;j++)
                 s[i]=max(s[j],s[j-weight[i]]);
        }
    }
}

int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&weight[i],&value[i],&num[i]);
    }
    dp();
    printf("%d",s[v]);    
    return 0;
}

依赖背包

问题描述

有两种物品,一个为主件,一个为附件,附件依赖于主件,只有购买了主件才能购买附件,要购买附件必须购买相应的主件。每个物品有相应的重量和价值,现有一个容量为V的背包,求背包能装下的最大价值。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int mweight[Maxsize];//每个主件的重量
int mvalue[Maxsize];//每个主件的价值
int weight[Maxsize][Maxsize];//每个主件的每个附件的重量
int value[Maxsize][Maxsize];//每个主件的每个附件的价值
int s[Maxsize];//每个状态的最大价值
int n;//物品的个数
int v;//背包的容量

void dp(){
    int tmpw,tmpv;
    for(int i=1;i<=mweight[0];i++){//mweight[0]记录了主件的个数
        tmp=mweight[i];
        tmpv=mvalue[i];
        for(int j=v;j>=tmp;j--)
            s[j]=max(s[j],s[j-tmp]+mvalue[i]);
        for(int j=1;j<=weight[i][0];j++){
            tmpw+=weight[i][j];
            tmpv+=value[i][j];
            for(int k=v;k>=tmpw;k--)
                s[k]=max(s[k],s[k-tmpw]+tmpv);
        }
    }
}


int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        int p,q,r;
        scanf("%d%d%d",&p,&q,&r);
        if(r==0){
            mweight[0]++;
            mvalue[0]++;
            mweight[mweight[0]]=p;
            mvalue[mvalue[0]]=q;
        }
        else{
            weight[r][0]++;
            value[r][0]++;
            weight[r][weight[r][0]]=p;
            value[r][value[r][0]]=q;
        }
    }
    dp();
    printf("%d",s[v]);
    return 0;
}

二维背包

问题描述

对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a和b。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int weight[Maxsize];//每个物品的重量
int price[Maxsize];//每个物品的价格
int value[Maxsize];//每个物品的价值
int s[Maxsize][Maxsize];//每个状态的最大价值
int n;//物品数量
int v;//背包容量
int u;//持有金钱

void dp(){
    for(int i=0;i<n;i++){
        for(int j=v,k=u;j>=weight[i]&&k>=price[i];j--,k--)
            s[j][k]=max(s[j][k],s[j-weight[i]][k-price[i]]+value[i]);
    }
}
int main(){
    scanf("%d%d%d",&n,&v,&u);
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&weight[i],&price[i],&value[i]);
    }
    dp();
    printf("%d",s[v][u]);    
    return 0;
}

多重背包

问题描述

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int weight[Maxsize];//每种物品的重量
int value[Maxsize];//每种物品的价值
int num[Maxsize];//每种物品的数量
int  s[Maxsize];//每个状态的最大价值
int n;//物品种数
int v;//背包容量

void dp(){
    for(int i=0;i<n;i++){
        for(int j=v;j>=1;j++)
            for(int k=1;k<=num[i];k++)
                if(j>=k*weight[i])
                    s[j]=max(s[j],s[j-k*weight[i]]+k*value[i]);
    }
}

int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&weight[i],&value[i],&num[i]);
    }
    dp();
    printf("%d",s[v]);
    return 0;
}

方案背包

问题描述

有N件物品和一个容量为V的背包。第i件物品的体积是weight[i]。求将背包装满的方案数。

实现代码

#include<iostream>
#include<cstdio>
using namespace std;

const int Maxsize=1000+10;
int weight[Maxsize];//每个物品的重量
int s[Maxsize][Maxsize];//记录每个状态的方案数
int n;//物品个数
int v;//背包容量

void dp(){
    s[0]=1;
    for(int i=0;i<n;i++){
        for(int j=v;j>=weight[i];j--)
            s[i][j]=s[i-1][j]+s[i-1][j-weight[i]];
    }
}

int main(){
    scanf("%d%d",&n,&v);
    for(int i=0;i<n;i++){
        scanf("%d",&weight[i]);
    }
    dp();
    printf("%d",s[n-1][v]);
    return 0;
}

转载于:https://www.cnblogs.com/mrpeng2333/p/11602912.html

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

背包 的相关文章

  • 2年开发经验去面试,面试官说我只会CRUD吗,难不成得是架构师水平?

    要说现在热门的编程语言 大多数程序员都会说Java Python JS PHP等 但Java应该是这其中应用最广泛的 但从各招聘信息上来看 Java程序员的薪资也是从最低4k月薪到高达百万年薪不等 从专业角度来说 架构师是薪资相对高的 实习
  • L2-012 关于堆的判断 (25 分)

    include
  • 字节跳动飞书音视频服务器开发面经 (小结)

    点关注 不迷路 持续更新Java相关技术及资讯 一面 1 自我介绍 2 讲讲你项目中用到的rtsp协议 3 你的项目中如何做的yuv到rgb的变换 为什么不直接用yuv 4 char 和 string有什么区别 实际中哪一个用的比较多 为什
  • 《我想进大厂》之网络篇夺命连环12问

    谈一谈你对TCP IP四层模型 OSI七层模型的理解 为了增强通用性和兼容性 计算机网络都被设计成层次机构 每一层都遵守一定的规则 因此有了OSI这样一个抽象的网络通信参考模型 按照这个标准使计算机网络系统可以互相连接 物理层 通过网线 光
  • java与SQL Server 2014连接

    首先打开数据库 创建一个数据库 然后开启数据库服务就好了 接下来 打开Myeclipse 创建工程 再创建包 创建包后 再创建类 结构如下 然后 再写类内容 package jdbcs import java sql import java
  • mysql 的select语句_MYSQL SELECT语句新手

    有没有办法可以 SELECT SELECT from table2 FROM table1 在table2中 我有一个列表 我想从table1中选择 如下所示 本周2015年4月24日开始 2015年1月31日开始 2015年07月02日开
  • linux运维工程师培训课程_Linux运维工程师面试赋能

    最近很多朋友通过各种渠道找到我 说自己的 朋友 亲戚 同事 毕业后找不到工作 部分同学自学了很长时间或者也参加过培训还是找不到 更有部分在职的朋友之前的工作也挺好 但是一跳槽突然发现也找不到了 都连面试没有 很迷茫也很痛苦 找一段时间之后信
  • 怎么把pdf转换成高清图片?

    怎么把pdf转换成高清图片 最近 我的同事遇到了一个问题 现在她需要将一些pdf文件转换成高清的图片 这件事情让让她感到非常无助 因为她非常着急需要将这些文件转换为图片格式 以便更好的在今后的工作中进行使用 她曾经尝试了很多工具和方法 也找
  • 2013年11月11日--12月19日(总共50小时,剩4822小时)

    11月11日 白天5小时 11月12日 白天5小时 11月13日 现在凌晨2点 打算封装下昨天的DDRAW引擎 填充函数的 实际上 应该算1个引擎 3点睡着 上午2小时 下午3小时 晚上2小时 共8小时 11月14日 4点起床 突然感觉 根
  • OpenCascade安装编译

    重新编译OpenCascade 在漫长的等待过程中 记录一下编译的流程 下载安装 OpenCascade官网中提供了直接安装的二进制版本 如果只是简单的使用需求可以直接下载安装 二进制版本使用VC 2017 64 bit编译 官网地址 源码
  • WSL搭建Java开发环境

    目录 安装WSL Ubuntu 18 04 修改默认用户为root 并修改用户目录 选 修改apt源 加快下载速度 选 Upgrade ubuntu Install xfce desktop Specify the display serv
  • Linux mariadb数据库主从实现

    一 环境准备 主数据库服务器 主机地址 172 16 1 51 从数据库服务器 主机地址 172 16 1 52 二 软件安装 部署 主数据库服务器 安装mariadb数据库 命令 yum isntall y mariadb mariadb
  • 【一】为什么有时候在cmd里pip的包,pycharm里面找不到?

    一 为什么我重装了一遍python 说来也算曲折离奇 今天下午 2021 11 8 实验室突然来了个不大不小的任务 我打开pycharm打算开始工作 然后发现 我的pycharm瘫了 毛病只有一个 双击图标打不开 无论如何都打不开 无奈之下
  • ASP.net web应用 GridView控件常用方法

    GridView 控件是 ASP NET Web Forms 中常用的数据展示控件之一 它提供了一个网格形式的表格 用于显示和编辑数据 GridView 控件对于包含大量数据 需要进行分页 排序和筛选的情况非常有用 GridView 控件的
  • 使用Python+Selenium的截图方法,这些必须要知道

    01 直接截取网页全屏 截全屏的时候 我们用到的内置方法为save screenshot demo1 png from selenium import webdriver from time import sleep class test
  • [YOLO专题-13]:YOLO V5 - ultralytics制作自己的训练数据集

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122288423 目录 前言
  • Setup and Hold time and clocking block in system verilog

    原文链接 http systemverilog123 blogspot com 2016 02 setup and hold time and clocking block html Friday February 5 2016 Setup
  • wirehark数据分析与取证misc1.pcap

    什么是wireshark wiresharek wireshark misc1 pcap数据包 wiresharek Wireshark 前称Ethereal 是一个网络封包分析软件 网络封包分析软件的功能是检索取网络封包 并同时显示出最详
  • C++值传递和引用传递

    1 值传递 值传递的定义 形参是实参的拷贝 改变形参的值并不会改变实参的值 从被调用函数的角度来看 值传递的方向是单向的 由实参传递到形参 参数的值只能传入不能传出 当函数的内部需要修改参数 并且不希望这个改变影响调用者时 采用值传递的方式
  • 信创大潮下,产业金融路在何方?

    一个金融数字化转型的底层逻辑正在显现 从客户需求出发 应用层 平台层升级 迭代 当达到开发天花板时 将会倒逼底层基础设施升级 迭代 前后端加速融合 作者 斗斗 编辑 皮爷 出品 产业家 2805 个银行网 点终止营业 网点正在 瘦身 一个事

随机推荐

  • convert_rknn.py onnx转rknn load_onnx函数报错: KeyError ‘output‘

    报错 原因 输出层的设置不对 解决方式 1 查看onnx模型的输出层名称 网页输入netron app https netron app 在网站内打开自己的onnx模型 然后找到模型最后的Reshape层 分别单击Reshape模块 查看O
  • 多态的四种表现形式

    多态的四种表现形式 在之前一提到多态 我下意识就是虚函数重写构成的运行时多态 直到看了一篇文章 才反应过来多态有四种表现形式 cpp polymorphism 运行时多态 虚函数 编译时多态 模板 重载 类型转换 运行时多态 Subtype
  • Eclipse导入和生成jar包

    Eclipse导入jar包 导入jar包 导入mysql connector java 8 0 30 jar时 还需更改src包下的module info java文件 导出 生成 jar包 如果要导出的类文件中有代码 报黄 Warning
  • 基于ARM汇编语言-多数据访问

    基于ARM汇编语言 多数据访问 概念 LDM 将一块内存的数据 加载到多个寄存器中 STM 将多个寄存器的值 存储到一块内存 格式 LDM 条件 s MODE基址寄存器 Reglist STM 条件 s MODE基址寄存器 Reglist
  • 编程小白C语言登陆验证

    题目要求 实现登陆验证 有3次机会 如果用户名为 李小欣 密码 888 提示登陆成功 否者提示还有几次机会 用for循环完成 思路分析 首先要定义一个变量 保存登陆的机会 次数 n 变量t为剩余次数 定义两个字符数组 接收 用户名和密码 使
  • mysql中清空表数据,并重置主键为1

    mysql中清空表数据 并重置主键为1 清空表数据 并重置主键为1 truncate table table name 删除表中指定数据 不影响表结构 后面可以加where条件 delete from table name 删除表 drop
  • 凯云科技惊艳亮相深圳国际电子展,为半实物仿真测试领域注入新活力

    高算力 低功耗 见证PPA影响力为社会智能化赋能 elexcon 2023深圳国际电子展于8月23至25日在深圳会展中心 福田 亮相 展览面积6万平方米 吸引全国优秀的展商600余家 凯云联创 北京 科技有限公司携多款软硬件产品惊艳亮相 0
  • 线性代数之 向量的内积,外积,长度,正交与正交矩阵

    线性代数之 向量的内积 外积 长度 正交和正交矩阵 向量的内积 向量的外积 向量的长度 向量正交 正交矩阵 正交矩阵的扩展 向量的内积 对于列向量 a b R n
  • 使用GPU版本的torch

    声明 1 我是不知道安装torch到底需不需要安装CNDA和CUDNN的 我是按照其他文章所说 才下载的 CNDA和CUDNN 通过一些视频展示 下载GPU版本的torch是包含了CNDA组件的 所以我觉得可能不需要下载CNDA和CUDNN
  • GraphEdit 实用手册

    GraphEdit是微软公司开发一个用于建立和测试音视频程序的可视化工具 它建立在Graph Filter的原则上 Directshow是基于模块化 每个功能模块即单元组件都采取COM组件方式 称为Filter 将Filter串联在一起就形
  • R语言 报错 错误: pandoc document conversion failed with error 1033 停止执行

    最近在学习一个R语言的时间序列课程 用RStudio的RMarkdown时遇见了这个报错 错误 pandoc document conversion failed with error 1033 停止执行 神奇 仔细查找了很久才发现自己代码
  • 12-9 案例:处理复杂的线程返回结果

    1 问题来源 thrd create 函数功能为新建一个线程 传入待执行的函数 待执行函数的格式要求如下 typedef int thrd start t void arg 这意味着待执行函数只能返回 int 类型值 接收 void arg
  • 如何关闭防火墙、windows defender的设置不可用。该应用已从服务器中卸载

    一 windows defender的设置不可用 该应用已从服务器中卸载 操作系统可能是gho镜像做的 被精简了 开始 运行 CMD 输入gpedit msc 回车 如果失败 先进行第二步在返回来进行第一步 二 1 在管理员bai命令提示d
  • 神经网络及其matlab仿真

    本文进行了神经网络原理简介 并对蜢虫分类问题进行了matlab仿真 一 神经网络介绍 神经网络是由具有适应性的简单单元组成的广泛并行互联的网络 它的组织能够模拟生物神经系统对真实世界物体作出的交互反应 神经网络中最基本的成分是神经元 neu
  • mysql 减法,mysql 减法

    SQL codemysql gt desc t a175460677 Field Type Null Key Default Extra uName char 3 YES NULL money float 10 2 YES NULL
  • Arduino平衡小车

    Arduino平衡小车 1 概述 此Arduino平衡小车在主控方面由Arduino UNO R3和Arduino sensor shield v5 0传感器扩展板组成 采用TB6612FNG作为电源和电机之间的中介给带编码器的直流电机供电
  • Nacos鉴权和配置加密

    nacos存在可以任意用户添加的问题 更改提交方式为POST 访问 nacos v1 auth users test111username test111 password 123456 新建一个账号test111 可以看到创建用户成功 如
  • STM32读写内部Flash(介绍+附代码)

    概述 内部Flash读写详解 一 介绍 首先我们需要了解一个内存映射 stm32的flash地址起始于0x0800 0000 结束地址是0x0800 0000加上芯片实际的flash大小 不同的芯片flash大小不同 RAM起始地址是0x2
  • SMTP:防止追踪发件人IP

    1 使用网页版gmail发信 邮件头不带X Originating IP 2 javamail调用SMTP时加代理 props put mail smtp socks host 10 11 22 2 props put mail smtp
  • 背包

    01背包 问题描述 有N件物品和一个容量为V的背包 第i件物品的体积是weight i 价值是value i 求解将哪些物品装入背包可使价值总和最大 实现代码 include