首页 > 其他分享 >0-1背包问题小结

0-1背包问题小结

时间:2022-11-18 11:35:39浏览次数:83  
标签:背包 weight max value 问题 vector include 小结 dp

使用二维数组的情况

先直接上代码。

#include<iostream>
#include<vector>
//bits/stdc++.h文件在实际开发中不要使用
//在VScode中似乎已经限制了bits/c++.h的使用。
// #include<bits/stdc++.h>
using namespace std;

//0-1背包问题
void test_2_wei_bag_problem1(){
    vector<int> weight ={1,3,4};
    vector<int> value = {15,20,30};
    int bagweight = 4;
    //二维数组 
    vector<vector<int>> dp(weight.size(),vector<int>(bagweight+1,0));
    //初始化
    for(int j=weight[0];j<=bagweight;j++){
        dp[0][j] = value[0];
    }

    //weight数组的大小 就是物品个数
    for(int i=1;i<weight.size();i++){
        for(int j=0; j<=bagweight;j++){
            if(j<weight[i]) dp[i][j] = dp[i-1][j];
            else dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);

        }
    }

    cout<<dp[weight.size()-1][bagweight]<<endl;
}


int main()
{
    test_2_wei_bag_problem1();
    
    //system("pause");
    //如果需要在VScode中运行出命令控制台,请加上。
}

代码中已经有比较详细的注释了,在此只提以下两点:

1.dp[i] [j] 表示背包重量为j时,装有i个物品时的总价值;
2.递推关系式为dp [i] [j] = max(dp [i-1] [j],dp [i-1] [j-weight[i]]+value[i])。

使用一维数组的情况

直接上代码。

#include <iostream>
#include <vector>

using namespace std ;

void test_0_1_bag_problem(){
    vector<int> weight = {1,3,4};
    vector<int> value = {15,20,30};

    int bagweight = 4;

    vector<int> dp(bagweight+1 ,0); 
    // dp[j]数组 表示重量为j的的背包里最多可装物品的价值
    // 初始化为0,避免大数覆盖遍历结果。
    for(int i=0;i<weight.size();i++){
        for(int j=bagweight;j>=weight[i];j--) //循环条件: 当包中还可以将第i个物品装下为止。
        {
            dp[j] = max(dp[j],dp[j-weight[i]] + value[i]); //递推关系式 dp[j] = max(dp[j] , dp[j-weight[i]] + value[i])
        } 
    }
    cout<<dp[bagweight]<<endl;

}

int main(){
    test_0_1_bag_problem();
    //system("pause");
    return 0;
}

同样也是两个要点:

1. dp[j] 表示重量为j的的背包里最多可装物品的价值;
2. 递推关系 dp[j] = max(dp[j],dp[j-weight[i]] + value[i])。

这里还需要注意的是,为了防止从前往后遍历的情况下,大数覆盖递推结果及同类物品被重复添加的问题,采用了从后往前的遍历方法。及dp[j] = max(dp[j],dp[j-weight[i]] + value[i])。

参考于《代码随想录》

@AHU_IAI_Threemen-ZL

标签:背包,weight,max,value,问题,vector,include,小结,dp
From: https://www.cnblogs.com/IAI-AHU-Threemen/p/16902645.html

相关文章

  • 【快应用】折叠屏手机打开快应用页面重新加载问题
    ​问题背景:折叠屏手机展开或者折叠时,快应用会重新加载页面,效果和初次进入当前页面相同,会回调生命周期函数onInit、onReady、onShow,通过页面调整传递的参数依然可以获取。......
  • 关于一个问题的证明
    \(10^{l+c}=10^c(\mathrm{mod}\b)\),\(10^c(10^l-1)=0(\mathrm{mod}\b)\)。又\(10^l=1(\mathrm{mod}\b')\),所以\(10^l-1=k_0b'\)。代入上式,所以\(10^c(k_0b')=k......
  • 360度评估中的问题示范:如何提问
    360度评估通常会向北评估人提出一系列的问题,而答案是在一个评分表上。它让管理者有机会从前辈、后辈和同龄人那里获得360度员工反馈。360调查甚至可能有开放性的问题,让受访......
  • 每日算法之跳台阶扩展问题
    JZ71跳台阶扩展问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。数据范围:1\len\l......
  • 关于前后端分离 跨域的问题之出现两次请求的问题(preflight预检)
    由于浏览器的同源保护需要,第一次请求(请求类型options)到服务器去验证到不到响应就无法通过验证所以需要对客户做一个正常响应(意思就是输出给浏览器,就是空内容)第二次才是......
  • 卷影删除小结
    一、几种系统方式卷影删除1.1WMICcmd.exe/cC:\\Windows\\System32\\wbem\\WMIC.exeshadowcopywhere\"ID='%s'\"delete1.2VSSADMINvssadminDeleteShadow/......
  • 博弈论练习8 Northcott Game(取石子问题)
    题目链接在这里:I-NorthcottGame_牛客竞赛博弈专题班组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏习题(nowcoder.com)这题是一个伪装的很好的取石子问题,可以发现,一个......
  • 整数划分问题
    Description 用一系列正整数之和的表达式来表示一个正整数,称为整数的划分,例如6可以划分为:65+14+2,4+1+13+3,3+2+1,3+1+1+12+2+2,2+2+1+1,2+1+1+1+11+1+1+1+1+1总......
  • vue 项目源码映射失败问题解决
    目录vue项目源码映射失败问题解决前言解决方案效果参考vue项目源码映射失败问题解决前言不知何时起,项目控制台调试进入源代码变成编译后的文件了,调试起来十分不便,强迫......
  • 约瑟夫问题--循环链表实现
    约瑟夫问题--循环链表实现问题:设编号为1、2...........n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它(m)的下一位又从1开始报数,数到m的那个人又......