【动态规划专栏】背包问题:01背包

简介: 【动态规划专栏】背包问题:01背包


题目来源

本题来源为:

牛客网01背包

题目描述

题目解析

我们分析一下本道题目,体积为5,有三个物品。

有两个问题:

1.求这个背包至多能装多大价值的物品?

2.若背包恰好装满,求至多能装多大价值的物品?

这两个问题区别就是,第一个问题背包可以装满可以不装满

而第二个问题是恰好装满。

算法原理

我们先说一下什么是背包问题:

你现在有一个背包,地上有一堆物品,每个物品有自己对应的体积与价值,而每个背包的容量有限,你需要在保证自己的书包容量的同时保障价值最大。这就是背包问题。

背包问题分为好多种:

而01背包和完全背包为最为常见的两种。

01背包就是里面的物品只能选一次或者不选。
完全背包是里面的物品可以没有次数限制。

问题1.1.状态表示

经验+题目要求

这里不能用一维而是要用二维dp表,因为不仅要保证价值还要保证物品的容量,因此用二维的dp表

对于本题而言就是:

dp[i][j]表示:从前i个物品中挑选,总体积不超过j,所有选法中,能挑选出来的最大价值

2.状态转移方程

还是根据最后一步的情况来进行情况讨论

因此状态方程为:

dp[i][j]=dp[i-1][j];
 if(j>=v[i]&&dp[i-1][j-v[i]]!=-1)
  dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);

3.初始化

跟之前一样,在原数组加一行一列

4.填表顺序

从上往下

5.返回值

dp[n][v]

问题2.1.状态表示

问题二跟问题一基本一样:

经验+题目要求

对于本题而言就是:

dp[i][j]表示:从前i个物品中挑选,总体积正好等于j,所有选法中,能挑选出来的最大价值

2.状态转移方程

还是根据最后一步的情况来进行情况讨论

因此状态方程为:

dp[i][j]=dp[i-1][j];
if(j>=v[i])
  dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);

3.初始化

跟之前一样,在原数组加一行一列

4.填表顺序

从上往下

5.返回值

dp[n][v]

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

#include <iostream>
#include <string.h>
using namespace std;
const int N=1010;
int n,V,v[N],w[N];
int dp[N][N];
int main() 
{
    //读入数据
    cin>>n>>V;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i]>>w[i];
    }
    //解决第一问:
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=V;j++)
        {
            dp[i][j]=dp[i-1][j];
            if(j>=v[i])
                dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<dp[n][V]<<endl;
    //解决第二问:
    memset(dp,0,sizeof dp);
    for(int j=1;j<=V;j++)
    dp[0][j]=-1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=V;j++)
        {
            dp[i][j]=dp[i-1][j];
            if(j>=v[i]&&dp[i-1][j-v[i]]!=-1)
                dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
        }
    }
     cout<<(dp[n][V]==-1?0:dp[n][V])<<endl;
}

空间优化:

空间优化有两种优化方式:

1.利用滚动数组进行优化

2.直接在原来的代码上进行修改

代码实现:

#include <iostream>
#include <string.h>
using namespace std;
const int N=1010;
int n,V,v[N],w[N];
int dp[N];
int main() 
{
    //读入数据
    cin>>n>>V;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i]>>w[i];
    }
    //解决第一问:
    for(int i=1;i<=n;i++)
    {
        for(int j=V;j>=v[i];j--)
                dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
    }
    cout<<dp[V]<<endl;
    //解决第二问:
    memset(dp,0,sizeof (dp));
    for(int j=1;j<=V;j++)
    dp[j]=-1;
    for(int i=1;i<=n;i++)
    {
        for(int j=V;j>=v[i];j--)
        {
            if(dp[j-v[i]]!=-1)
                dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
    }
     cout<<(dp[V]==-1?0:dp[V])<<endl;
}
相关文章
|
消息中间件 NoSQL Java
300+页!卷王级别Java面试宝典-阿里服务端开发与面试知识手册!
金九银十,市场火热,但是大家就业压力却没有缓解多少。 我自己也有实感,多年身处一线互联网公司,虽没有直面过求职跳槽的残酷,但经常担任技术面试考官,对程序员招聘市场的现状很清楚。
348 0
|
8月前
|
人工智能 自然语言处理 DataWorks
DataWorks Copilot 集成Qwen3-235B-A22B混合推理模型,数据开发与分析效率再升级!
阿里云DataWorks平台正式接入Qwen3模型,支持最大235B参数量。用户可通过DataWorks Copilot智能助手调用该模型,以自然语言交互实现代码生成、优化、解释及纠错等功能,大幅提升数据开发与分析效率。Qwen3作为最新一代大语言模型,具备混合专家(MoE)和稠密(Dense)架构,适应多种应用场景,并支持MCP协议优化复杂任务处理。目前,用户可通过DataWorks Data Studio新版本体验此功能。
646 23
DataWorks Copilot 集成Qwen3-235B-A22B混合推理模型,数据开发与分析效率再升级!
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
635 2
动态规划算法学习三:0-1背包问题
|
存储 缓存 运维
有关一次FullGC的故障排查
在收到容器CPU使用率达到104%的告警后,通过日志发现多个线程正在进行批处理任务。初步怀疑Full GC导致CPU占用过高,但内存使用率仅为62%,不符合预期。进一步排查发现监控指标与实际情况不符,最终确认是由于JVM Full GC引起的CPU激增。通过分析堆内存快照,定位到四个大型`List<Map<String, String>>`对象占用了近900MB内存,这些对象由用户上传的Excel转换而来,导致内存膨胀。这些大对象在JVM中长时间驻留,容易触发Full GC。 为解决此问题,提出了两种方案: 1. 将数据存储于缓存而非JVM内存中; 2. 减少内存中对象的数据量,如删除无用字
|
JavaScript 小程序
VUE3(三十五)vite构建的项目配置使用.env文件
VUE3(三十五)vite构建的项目配置使用.env文件如标题所示:我要在vue3项目使用.env文件。 先介绍一下项目背景,项目使用VUE3.2 + vite2.9 + typescript搭建。 我基本断定,vue3使用.env文件的方法可能和vue2使用.env文件的方法可能是不同,关于vue2项目如何使用.env文件,请移步《VUE2(七)VUE配置env文件使用》
752 1
|
关系型数据库 MySQL 测试技术
压测工具sysbench的使用
压测工具sysbench的使用
1347 0
经典递归问题:汉诺塔【超详解】
经典递归问题:汉诺塔【超详解】
2212 0
|
SQL 运维 NoSQL
【Redis 故障排查】「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案
【Redis 故障排查】「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案
540 0
|
Java
最小覆盖子串(Java详解)
最小覆盖子串(Java详解)
250 0
|
Prometheus Cloud Native 关系型数据库
prometheus|云原生|prometheus项目安装postgres-exporter监视组件的部署简介
prometheus|云原生|prometheus项目安装postgres-exporter监视组件的部署简介
946 0