01--背包问题以及构造最优解

2023-11-11

1、01–背包问题

01–背包问题:就是有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?一个物品只有装与不装两种选择,不能只放一部分。
在这里插入图片描述在这里插入图片描述

样例输入
5 10
6 3 5 4 6
2 2 6 5 4
样例输出
15
11001

1.从最后一个物品填表格
在这里插入图片描述
2. 从第一个物品填表格
在这里插入图片描述
从最后一个物品填表格

#include<bits/stdc++.h>
using namespace std;
 
int w[1005];
int v[1005];
int m[105][105];
int main()
{
    int n,c;
    while(~scanf("%d %d",&n,&c))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for(int j=1;j<=n;j++)
            scanf("%d",&w[j]);
        int min1=min(w[n]-1,c);防止数组越界,物品的重量超过背包的容量了
        for(int i=0;i<=min1;i++)//小于w[n]的填0
            m[n][i]=0;
        for(int j=w[n];j<=c;j++)//大于等于w[n]的填v[n]
            m[n][j]=v[n];
        for(int i=n-1;i>=1;i--)
        {
            int min2=min(w[i]-1,c);//防止数组越界,物品的重量超过背包的容量了
            for(int j=0;j<=min2;j++)
                m[i][j]=m[i+1][j];
            for(int j=w[i];j<=c;j++)
                m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
        }
        printf("%d\n",m[1][c]);
    }
    return 0;
}

2、构造最优解

在这里插入图片描述
如果选择从最后一个物品填表格(第一个物品),那么构造最优解的时候就从右上角(右下角)出发,比较i行和i+1行正下方的数字是否相同,不相同则选择了i行的物品,然后再j-w[i]列i行和i+1行数字是否相同;相同则往下一行同一列比较数字是否相同。

#include<bits/stdc++.h>
using namespace std;
 
int w[1005];
int v[1005];
int m[105][105];
int main()
{
    int n,c;
    while(~scanf("%d %d",&n,&c))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for(int j=1;j<=n;j++)
            scanf("%d",&w[j]);
        int min1=min(w[n]-1,c);防止数组越界,物品的重量超过背包的容量了
        for(int i=0;i<=min1;i++)//小于w[n]的填0
            m[n][i]=0;
        for(int j=w[n];j<=c;j++)//大于等于w[n]的填v[n]
            m[n][j]=v[n];
        for(int i=n-1;i>=1;i--)
        {
            int min2=min(w[i]-1,c);//防止数组越界,物品的重量超过背包的容量了
            for(int j=0;j<=min2;j++)
                m[i][j]=m[i+1][j];
            for(int j=w[i];j<=c;j++)
                m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
        }
        printf("%d\n",m[1][c]);
        for(int i=1;i<n;i++)
        {
            if(m[i][c]==m[i+1][c])//不装
                printf("0");
            else
            {
                printf("1");//装
                c=c-w[i];
            }
        }
        if(m[n][c]>0)//最后一个物品的判断
            printf("1");
        else
            printf("0");
        printf("\n");
    }
    return 0;
}

3、动态规划法求解01-背包问题的局限性

背包的容量、物品的重量均只能是正整数。因为我们在使用动态规划求解01背包问题的时候,是将背包的容量已经物品的重量作为填表格的列来处理的,我们知道数组的行和列均只能是正整数。

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

01--背包问题以及构造最优解 的相关文章

  • 使用动态链接库的好处

    1 可以采用多种编程语言来编写 2 增强产品的功能 3 提供二次开发的平台 4 简化项目管理 5 可以节省磁盘空间和内存 6 有助于资源的共享 7 有助于实现应用程序的本地化 更多内容请看C C 动态链接库 DLL 详解 来源 孙鑫 VC
  • 真正的人工智能支付时代已经来临

    我国就开始掀起人工智能热潮 随着互联网推动数字化的普及以及计算能力的进一步提高 真正的人工智能时代已经来临 刷脸支付基于人脸识别这种人工智能技术 已经广泛应用于商超 零售 医疗 景区等各大生活场景 刷脸支付做为2019年的迸发元年 嗅到商机

随机推荐

  • vue:分页跳转页面详情,返回记住当前点击第几页

    背景 项目中从列表页跳转到详情页返回的时候会默认跳转到分页的第一页 不利于用户的体验 所以需要返回到当前页 实现方法 方法一 Vue2提供了组件级路由钩子函数 分别是beforeRouteEnter beforeRouteUpdate be
  • 解决gbk转utf8乱码

    解决GBK字符转UTF 8乱码问题 gbk转utf 8 奇数中文乱码 一 乱码的原因 gbk的中文编码是一个汉字用 2 个字节表示 例如汉字 内部 的gbk编码16进制的显示为c4 da b2 bf utf 8的中文编码是一个汉字用 3 个
  • opencv VS 环境搭建 读取显示图像 访问像素

    1 opencv 下载 Releases OpenCV 这两个都可以 一个是安装包 一个是压缩吧 安装包也就是个解压的东西 没啥区别 若下载速度慢考虑翻墙 不然就等等 解压之后 source是opencv源码 build 是opecv 的源
  • SQL Server数据的Aes加密存入与解密取出

    最近在做winfrom的毕设 边做边学 由于这个东西折磨了我一天 所以写一篇学习心得记录一下这天的收获 顺便吐槽一下这个气人代码 由于本人是个菜鸡所以如果有缺陷或不足的地方欢迎大佬指出 另 项目环境为 VS2022 SQL Server 2
  • python绘制频谱图_使用python进行傅里叶FFT-频谱分析详细教程

    目录 一 一些关键概念的引入 1 离散傅里叶变换 DFT 2 快速傅里叶变换 FFT 3 采样频率以及采样定理 4 如何理解采样定理 二 使用scipy包实现快速傅里叶变换 1 产生原始信号 原始信号是三个正弦波的叠加 2 快速傅里叶变换
  • 关于plt.imshow()显示彩图问题

    https blog csdn net cnnmena article details 79613531 转载于 https www cnblogs com weststar p 11539800 html
  • fabric.js 怎么将 Group 中的元素包装在一个容器元素中,然后绑定事件到group元素的某个子元素上...

    你可以这样做 在 Group 中添加一个容器元素 比如一个矩形或圆形 将 Group 中的其他元素添加到容器元素中 使用 Group 对象的 on 方法绑定事件到容器元素上 例如 创建一个 Group var group new fabri
  • 操作系统:主存储器空间的分配和回收

    主存储器空间的分配和回收 预习报告 一 实验内容 主存储器空间的分配和回收 二 实验目的 一个好的计算机系统不仅要有一个足够容量的 存取速度高的 稳定可靠的主存储器 而且要能合理地分配和使用这些存储空间 当用户提出申请存储器空间时 存储管理
  • 【千律】C++基础:析构函数

    报错strcpy不安全 解决方法 项目 gt 属性 gt C C gt 预处理器 gt 预处理器定义 添加 CRT SECURE NO DEPRECATE CRT NONSTDC NO DEPRECATE include
  • 机器学习(第一章)

    第一章 绪论 1 1 引言 根据训练数据是否有标记可将训练任务分为 有监督学习 supervised learning 和 无监督学习 unsupervised learning 前者有回归和分类 后者有聚类 泛化能力 模型适用于新样本的能
  • 创建节点和用法

    创建节点 appendchild 的用法 效果如下 insertBefore 的用法 效果 removeChild 的用法 效果 replaceChild 的用法 效果 search 方法用于查询指定的字符串的初始位置 并获取它的下标 se
  • 研究生必备:从0到1使用Zotero

    一 初识zotero 文献导入与引用 1 安装地址 https www zotero org 点击下一步一直安装 编辑 首选项 高级 选择语言为中文 2 文献导入 1 在我的文库下面可以新建文件夹 在中间标题部分可以拖进去本地下载的PDF
  • STL——(8)set/ multiset 容器和pair对组

    set multiset 容器和pair对组 1 set基本概念 2 set构造和赋值 3 set大小和交换 4 set插入和删除 5 set查找和统计 6 set和multiset区别 7 pair对组创建 8 set容器排序 1 set
  • 学编程太枯燥太难怎么办?

    大家好 我是老三 和大家分享一些我学编程的经历 那年二十 头发浓密如野狗 夏日炎炎 枯坐机房如木头 一根指头 颤颤巍巍如老叟 敲下了第一行 Hello World 开启了编程学习生涯 刚开始 参加的是学校的一个夏季编程训练营 起初是有学长学
  • 2023年以太坊测试网水龙头整理(包含Goerli和Sepolia)

    2023年以太坊测试网水龙头整理 包含Goerli和Sepolia 区块漫步 2023年以太坊测试网水龙头整理 包含Goerli和Sepolia 空投交互By blockwander 去中心化应用在以太坊主网上线之前 都会在以太坊测试网上先
  • 互联网摸鱼日报(2022-09-16)

    互联网摸鱼日报 2022 09 16 InfoQ 热门话题 1 从某保险机构数据库全面国产化 看如何跨越金融数据价值鸿沟 2 Flink 从实时计算到流式数仓 下一步去往哪里 3 CEO们突然介入到 IT建设 企业纷纷迁出VM虚拟机基础设施
  • 【git学习】本地关联远程仓库

    目录 一 本地仓库关联远程仓库 新建仓库 二 拉取远程分支到本地 已有远程仓库 一 本地仓库关联远程仓库 新建仓库 本地新建工程 然后关联远程git仓库并向远程仓库提交代码 1 本地新建工程 这里我使用idea创建 2 在远程仓库新建仓库
  • SIP相关的RFC文档索引

    http www packetizer com ipmc sip standards html
  • Mysql服务器安装步骤

    安装包 windows10 MySQL Server 5 7 mysql installer community 5 7 26 0 msi 安装步骤 双击运行下载好的mysql installer community 5 7 26 0 ms
  • 01--背包问题以及构造最优解

    目录 1 01 背包问题 2 构造最优解 3 动态规划法求解01 背包问题的局限性 1 01 背包问题 01 背包问题 就是有n个物品 它们有各自的体积和价值 现有给定容量的背包 如何让背包里装入的物品具有最大的价值总和 一个物品只有装与不