首页 > 其他分享 >【DP】01背包问题与完全背包问题

【DP】01背包问题与完全背包问题

时间:2024-03-24 23:01:00浏览次数:21  
标签:背包 int 件物品 01 体积 物品 include DP

一、01背包问题

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

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

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

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤1000
0<vi,wi≤10000

输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8

分析:

(1)使用动态规划DP来解决这个问题,首先明确f[i][j]是只考虑前i个物品总体积不超过j的选法集合

(2) 我们对f[i][j]进行划分,分为所有不选第i个物品的方案f(i-1,j)

        所有选第i个物品的方案f(i-1,j-v[i])+w[i]

(3)取上面两种方案价值最大的

(1)二维暴力解法 

#include<iostream>
#define N 1010
using namespace std;

int v[N];
int w[N];
int f[N][N];//只考虑前i个物品且总体积不超过j的选法集合
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){//前i个物品都不选,总体积j可以为0
            f[i][j]=f[i-1][j];//左半边的子集
            if(j>=v[i]) //右边有可能取不到,要判断
            f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][m];
    return 0;
}

(2)一维优化解法 

#include <iostream>
using namespace std;
#define N 1010
int w[N],v[N];
int x[N];
int main()
{
  // 请在此输入您的代码
  int m,n;
  cin>>m>>n;
  for(int i=1;i<=n;i++){
    cin>>w[i]>>v[i];//体积和价值
  }
  for(int i=1;i<=n;i++){
    for(int j=m;j>=w[i];j--){//倒序,将判断条件直接加进循环里
      x[j]=max(x[j],x[j-w[i]]+v[i]);
    }
  }
  cout<<x[m];
  return 0;
}

二、完全背包

 与01背包不同的是完全背包问题的每个物品可以无限选用

#include <iostream>
using namespace std;
#define N 1010
int w[N],v[N];
int x[N];
int main()
{
  // 请在此输入您的代码
  int m,n;
  cin>>m>>n;
  for(int i=1;i<=n;i++){
    cin>>w[i]>>v[i];//体积和价值
  }
  for(int i=1;i<=n;i++){
    for(int j=w[i];j<=m;j++){//与01背包相比,将其正序
      x[j]=max(x[j],x[j-w[i]]+v[i]);
    }
  }
  cout<<x[m];
  return 0;
}

 

标签:背包,int,件物品,01,体积,物品,include,DP
From: https://blog.csdn.net/weixin_74154742/article/details/136992852

相关文章

  • 中考英语首字母快速突破016-2021上海长宁英语二模-Coping Tips for Impatience-应对不
    PDF格式公众号回复关键字:ZKSZM016原文​Impatientpeopleareoftenseenasproudandself-important.Beingimpatientcanaffectyourrelationshipsatworkandathomenegatively(有害地).Peoplewillsenseangerfromyouandnotlike(71)dwithyouif......
  • 01背包
    0/1背包二维形式二维数组f[][]被用作动态规划的辅助数组,它的作用是存储在不同的背包容量和不同的物品选取情况下所能达到的最大总价值。具体来说,f[i][j]表示在前i个物品中选取,并且背包容量限制为j时所能达到的最大总价值。在动态规划的过程中,f[i][j]的计算依赖于前一行......
  • P5324 [BJOI2019] 删数
    P5324[BJOI2019]删数转化条件+线段树由于值域不大,并且删数操作跟序列顺序无关,只和每个数的出现次数有关,考虑在值域上分析删数操作。发现对于每一个值\(i\)可以抽象为覆盖了\([i-buc_{i}+1,i]\)的区间。要使数列删空,就要让\([1,n]\)被填满。这样我们就会发现答案就是\([......
  • RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程
    RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程文章目录RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程1.安装环境说明1.WindowServer20192.ErLang与RabbitMQ对应版本2安装Erlang1.安装Erlang2.ErLnag环境变量配置3.查看是否安装成功3.安......
  • 2019 年互联网寒冬下IT程序员招聘行情招聘形势感受
        几次听到过一个段子:2019年可能会是过去10年里最差的一年,但却是未来10年里最好的一年。前不久在清华大学上课的时候我们一个教授(他参与当前国家经济政策制定的)也善意提醒我们未来几年花钱一定要紧,切勿乱投资。虽然这些说法或许有些过于绝对和悲观,但春江水暖鸭先知,相信说......
  • windows server2012安装百度云网盘导致内存溢出
    步骤首先需要下载软件shexview,一款免费的软件,用于查看Windows资源管理器安装的插件。下载地址https://www.nirsoft.net/utils/shexview-x64.zip下载后解压运行shexview.exe: 打开能看到Windows资源管理器安装的插件,可以看到我已经将所有百度网盘的插件全部禁用掉了。 ......
  • P10111 [GESP202312 七级] 纸牌游戏 题解
    看标签知道要用DP。于是开始分析。状态:$dp(i,j,k)=$前\(i\)轮中,第\(i\)轮出\(j\),一共换了\(k\)次牌的最大钱数。很好理解。转移也不难,不就是不换和换两种吗!所以,转移就是:\[dp(i,j,k)=\max\begin{cases}dp(i-1,j,k)+\operatorname{pk}(j,c_i)\times......
  • 【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
    本文涉及知识点动态规划汇总C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例包括课程视频C++算法:滑动窗口总结多重背包LeetCode2902.和带限制的子多重集合的数目给你一个下标从0开始的非负整数数组nums和两个整数l和r。请你返回nums中子多重集......
  • Adobe的PDF编辑软件Acrobat Pro DC 2024.001.20604版本下载与安装教程
    目录前言一、AcrobatProDC2024安装二、使用配置总结前言PDF格式(缩写为便携式文档格式和便携式文档格式)的发展始于1990年。这种格式用于以类似于打印文档的固定格式呈现包含文本、图像和其他要求的文档。Adobe在1993年发布了专有的Acrobat软件,首次展示了对这种......
  • 洛谷之P1563 [NOIP2016 提高组] 玩具谜题
    题目 [NOIP2016提高组]玩具谜题题目背景NOIP2016提高组D1T1 题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图: 这时singer告诉小南一个谜......