首页 > 其他分享 >完全背包问题

完全背包问题

时间:2024-08-27 19:26:00浏览次数:4  
标签:背包 int 代码 完全 问题 物品 include dp

完全背包问题

有 N种物品和一个容量是 V的背包,每种物品都有无限件可用。
第 i种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i种物品的体积和价值。

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

数据范围
0<N,V≤1000
0<vi,wi≤1000

输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10
代码一:根据定义,从0-1背包进行编码,不过k的循环次数不确定,容易造成 TLE,别用这个代码,过不了,单纯从定义出发的

#include<iostream>
#include<algorithm>    

using namespace std;      

const int N = 1010;      

int n,m;      
int v[N],w[N];      
int dp[N][N];      

int main(){      
    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++)      
          for(int k=0;k*v[i]<=j;k++){      
            dp[i][j] = max(dp[i][j],dp[i-1][j-v[i]*k]+w[i]*k);      
          }
    cout<<dp[n][m]<<endl;      
    
    
    return 0;      
}

代码二:
优化k层循环,每个物品的选取次数的不同,都会归结于dp[i][[j-v]+w,因此不需要第k层的代码,优化后得到如下代码

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1010;

int n,m;
int v[N],w[N];
int dp[N][N];

int main(){
    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++){
          dp[i][j] = dp[i-1][j];
          if(j>=v[i]) dp[i][j] = max(dp[i][j],dp[i][j-v[i]]+w[i]);
      }
    cout<<dp[n][m]<<endl;
    
    
    return 0;
}

代码三:
与0-1背包的优化不同的是,0-1背包是不能覆盖上一层的值,因此内层倒序循环,而完全背包根据代码二进行优化的是覆盖上一层的值来进行计算的,因此内层循环不需要倒序循环,删去dp的i维即可得到优化后的代码。

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1010;

int n,m;
int v[N],w[N];
int dp[N];

int main(){
    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=v[i];j<=m;j++){
          dp[j] = max(dp[j],dp[j-v[i]]+w[i]);
      }
    cout<<dp[m]<<endl;
    
    
    return 0;
}

标签:背包,int,代码,完全,问题,物品,include,dp
From: https://blog.csdn.net/weixin_46006714/article/details/141610219

相关文章

  • 【数字】AXI burst跨4k的问题
    AXI总线,burst操作,不能跨4K边界问题!在Master_A设计中,假如Master_A只操作一块64MSDRAM(此Master_A不操作任何其他Slave),读写的数据量远远大于4K。因此其中某个Burst的操作可能会出现在4K边界上。请问:在这样的情况下,Master_A设计的Burst操作是否需要遵守4k边界的约定?  ......
  • C++学习随笔——关联容器的迭代器失效问题
    常见关联容器的迭代器失效规则std::map和std::set:插入元素:插入新元素不会使任何已有的迭代器失效。你可以在插入新元素后继续使用所有现有的迭代器。删除元素:删除某个元素会导致指向该元素的迭代器失效。除此之外,所有指向其他元素的迭代器仍然有效。如果在遍历过程中删除......
  • 常见 git 问题
    常见git问题文件名大小写问题​由于git默认对大小写不敏感,如果文件名从小写变成了大写之后,无法发现文件有变化导致没有提交到仓库。更可怕的是mac也是大小写不敏感,经常出现到本地可以运行,到服务器就执行错误的情况。为此,我们最好把git的默认大小写关闭。下面的命令。......
  • 组织和策略问题
    第0条不要拘泥于小节(又名:了解哪些东西不应该标准化)只规定需要规定的事情:不要强制施加个人喜好或者过时的做法。第1条在高警告级别干净利落地进行编译高度重视警告:使用编译器的最高警告级别。应该要求构建是干净利落的(没有警告)。理解所有的警告。通过修改代码而不是降低......
  • Dirsearch-master安装使用及常见问题解决(互联网和内网)
    1、文档概述        本手册适用于帮助初学者快速掌握Dirsearch-master的安装、配置与使用方法。通过阅读本文档,您将能够了解如何搭建Dirsearch-master环境、扫描目标服务器上潜在的敏感文件和目录,并解读生成的报告。此外,本文档还涵盖了常见问题及解决方法,以便您在实际......
  • MATLAB智能优化算法-学习笔记(1)——遗传算法求解0-1背包问题【过程+代码】
    一、问题描述(1)数学模型(2)模型总结目标函数:最大化背包中的总价值Z。约束条件:确保背包中的物品总重量不超过容量W。决策变量:每个物品是否放入背包,用0或1表示。这个数学模型是一个典型的0-1整数线性规划问题。由于其NP完全性,当问题规模较大时,求解此问题通常需要使用启发......
  • 四皇后问题Python实现
    四皇后问题是出自于国际象棋来提出的,众所周知,皇后(queen)在国际象棋中可以控制横竖以及斜线的棋子,那么四皇后的规则是什么呢,咱们废话不多说,直接进入它的规则。1.四皇后问题的规则四皇后问题其实就是把四个皇后放在一个四*四的棋盘上使这些皇后不被互相控制就像这样:那么怎么......
  • 基于OpenCV-Python实现人脸识别-----摄像头捕获人脸图像显示中文乱码问题
    基于OpenCV-Python实现人脸识别时,为了使图像上显示识别到人员的中文名字,做了几次尝试,使用PIL.Image和OpenCV图像格式相互转换解决:使用OpenCV将图片灰度化,对加载的灰度化图使用分类器中的detectMultiScale()函数查找目标人脸,并使用for循环实现矩形框和圆形框框住查找到的人脸。......
  • 9步带你完全了解FPC柔性电路板,一文搞懂什么是FPC!
    FPC你所要了解的—01FPC软板,是一种神奇的电子元件,它能够随心所欲地弯曲、折叠、缠绕,像一条灵活的蛇,在狭小的空间里穿梭自如。它是怎么做到的呢?随着社会的不断进步,电子行业的不断更新换代,传统的PCB已经不能满足所有电子产品的需求,FPC的市场需求也越来越大,有很多朋友还不......
  • [kernel] 带着问题看源码 —— 脚本是如何被 execve 调用的
    前言在《[apue]进程控制那些事儿》一文的"进程创建->exec->解释器文件"一节中,曾提到脚本文件的识别是由内核作为exec系统调用处理的一部分来完成的,并且有以下特性:指定解释器的以#! (shebang)开头的第一行长度不得超过128shebang最多只能指定一个参数shebang指......