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

动态规划——01背包问题

时间:2024-12-13 14:13:42浏览次数:8  
标签:vector 01 vol value int 背包 动态 dp

01背包问题是一个经典的动态规划问题,虽然基础,之前做过很多遍,但是长时间不接触算法还是会忘记,故记录一下。


问题定义:

有 N 件物品和一个容量是V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

具体的练习题目见https://www.acwing.com/problem/content/description/2/


解题思路:

1、首先想一下暴力做法怎么解01背包:

每个物品有选与不选两种状态,用回溯算法遍历全部的可能性,时间复杂度也就是O(2^n)

2、dp数组的含义

首先明确二维dp数组的思路,然后可以优化为一维dp数组的做法

dp[i][j]表示:第[1,i]物品任取放入容量为j的背包中的最大价值

3、dp数组的大小

建议设置为dp[n+1][v+1],这样子不用对首行首列单独初始化

4、状态转移方程

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

4、双重for循环的遍历先后(先for物品 还是 先for容量)

结论:

对于二维dp数组,先物品/先容量 都可以,因为dp[i][j]都是由上方和左上方得来的

对于一维dp数组(滚动数组),就只能先物品才行


代码:

二维dp:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,v;
    cin>>n>>v;
    vector<int> vol(n);
    vector<int> value(n);
    for(int i=0;i<n;i++){
        cin>>vol[i]>>value[i];
    }
    vector<vector<int>> dp(n+1,vector<int>(v+1));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=v;j++){
            if(j>=vol[i-1])dp[i][j]=max(dp[i-1][j],dp[i-1][j-vol[i-1]]+value[i-1]);
            else dp[i][j]=dp[i-1][j];
        }
    }
    cout<<dp[n][v];
    return 0;
}

一维dp:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,v;
    cin>>n>>v;
    vector<int> vol(n);
    vector<int> value(n);
    for(int i=0;i<n;i++){
        cin>>vol[i]>>value[i];
    }
    vector<int> dp(v+1);
    for(int i=1;i<=n;i++){
        for(int j=v;j>=vol[i-1];j--){
            dp[j]=max(dp[j],dp[j-vol[i-1]]+value[i-1]);
        }
    }
    cout<<dp[v];
    return 0;
}

 

标签:vector,01,vol,value,int,背包,动态,dp
From: https://www.cnblogs.com/Pworldlet/p/18604787

相关文章

  • 1501、基于51单片机的报警器(红外入侵,时间段)(proteus仿真+程序+原理图+流程图+元器件清
    目录方案选择单片机的选择一、设计功能二、proteus仿真图三、原理图四、程序源码资料包括:方案选择单片机的选择方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时......
  • 24.01.002 MATRICES
    MATRIXOPERATIONSThediagonalentriesinan\(m\timesn\)matrix\(A\)(\(a_{ij}\)are\(a_{11},a_{22},a_{33},\dots\)andtheyformthemaindiagonalofA.Adiagonalmatrixisasquarennmatrixwhosenon-diagonalentriesarezero.Anexampl......
  • Java-25 深入浅出 Spring - 实现简易Ioc-01 Servlet介绍 基本代码编写
    点一下关注吧!!!非常感谢!!持续更新!!!大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html案例思路参考来源来自网络视频,这里的案例是转账的案例。这里我们直接使用接口的方式,就不实现具体的页面了,我们直接通过接口调用的方式来模拟这一块。最终将实......
  • 江科大STM32学习:01 C语言(2)指针
    1.指针简介指针Pointer是C语言的一个重要知识点,使用灵活,功能强大指针和底层硬件联系紧密(寄存器),使用指针可操作数据的地址,实现数据的间接访问2.计算机存储机制每个区域都是一个字节,线性分配下去,每个字节对应一个地址。注:一个字节是8bitinta=0x12345678;//十六进制,八......
  • 完全背包问题
    问题再现:有N种物品和一个容量是V的背包,每种物品都有无限件可用。第i种物品的体积是vi,价值是wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式:第一行两个整数,N和V,用空格隔开,分别表示物品种数和背包容积。接下来......
  • 【.Net动态Web API】参数验证异常返回
    ​......
  • 01背包问题
    方法一:记忆化搜索#include<algorithm>#include<iostream>#include<cstring>constintN=1000;intn,V;intv[N],w[N];intmem[N][N];intmax(inta,intb){returna>b?a:b;}intdfs(intx,intspV){if(mem[x][spV])returnmem[x][spV];ints......
  • 数据集搜集器(百科)015
    测试步骤:运行程序:运行上述代码,输入一个词条(如“Python”)并点击“获取回答”按钮。importtkinterastkfromtkinterimportfiledialog,messageboximportrequestsfrombs4importBeautifulSoupimportjsonimportosimportthreadingfromtkinterimportttkim......
  • 数据集搜集器(百科)016
    增强模拟人操作的效果,并且确保只有在百度百科和搜狗百科都正确输出时才保存记录,我们在数据集搜集器(百科)015代码中增加一些逻辑来实现这一点。以下是改进后的代码:importtkinterastkfromtkinterimportfiledialog,messageboximportrequestsfrombs4importBeautif......
  • 001 星际蜗牛 黑群晖 配置 安装
    星际蜗牛硬盘位置RAID的类型都是Basic,不需要做磁盘阵列。文件系统选择:ext4,比较稳定。NAS结构图:系统盘:硬盘2| 固态M2:32GB【系统盘】第一层:硬盘4|  插口坏了  西数WD1600AAJS-08PSA0  149.1GB  【大旧衰】第二层:硬盘3|  东芝TOSHIBAMQ01ABD050  465.8GB......