当前位置: 首页 > news >正文

完全背包问题(c++)

完全背包问题

当前有 N 种物品,第 i 种物品的体积是 ci​,价值是 wi​。

每种物品的数量都是无限的,可以选择任意数量放入背包。

现有容量为 V 的背包,请你放入若干物品,使总体积不超过 V,并且总价值尽可能大。

解析
虽然物品个数是无限的,但是实际上,由于背包容量有上限,每个物品最多选取的个数也是有限制的,这样可以转换成多重背包问题,进而可以转换成 01 背包问题。

可以用多重背包的思想来解决完全背包。

for (int i = 1; i <= N; i++) {for (int j = 0; j <= V; j++) {for (int k = 0; k * c[i] <= j; k++) {dp[i][j] = max(dp[i - 1][j - c[i] * k] + w[i] * k, dp[i][j]);}}
}

时间效率优化

我们可以注意到

dp[i][v]=max(dp[i−1][v],dp[i−1][v−ci​]+wi​,dp[i−1][v−ci​×2]+wi​×2…)

dp[i][v−ci​]=max(dp[i−1][v−ci​],dp[i−1][v−ci​×2]+wi​,dp[i−1][v−ci​×3]+wi​×2…)

也就是说,我们完全可以用 dp[i][v−ci​] 的信息去更新 dp[i][v],而不用去多此一举去枚举 k 了,转移可以直接变成如下:

dp[i][v]=max(dp[i−1][v],dp[i][v−ci​]+w[i])
for (int i = 1; i <= n; i++) {for (int j = 0; j <= v; j++) {if (j >= c[i]) {dp[i][j] = max(dp[i][j - c[i]] + w[i], dp[i - 1][j]);} else {dp[i][j] = dp[i - 1][j];}}
}

完整代码

 

#include <iostream>
#include <cstring>
using namespace std;int dp[21][1010];
int w[21], c[21];int main() {int N, V;cin >> N >> V;for (int i = 1; i <= N; i++) {cin >> w[i] >> c[i];}for(int i = 1; i <= N; i++){for(int j = 0; j <= V;  j++){if(j >= c[i]) {dp[i][j] = max(dp[i][j - c[i]] + w[i], dp[i - 1][j]);}else {dp[i][j] = dp[i-1][j];}}}cout << dp[N][V] << endl;return 0;
}

 

 

 

 

http://www.lryc.cn/news/347171.html

相关文章:

  • 综合性练习(验证码案例)
  • 实用的Chrome命令 帮你打开Chrome浏览器的隐藏功能
  • Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)
  • CSS-盒子模型
  • WPF之页的使用
  • 【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )
  • thinkphp5 中控制器的创建和使用方法
  • [Linux] 常用服务器命令(持续更新)
  • 编译官方原版的openwrt并加入第三方软件包
  • PC适配移动端
  • springboot+vue+mybatis灵活就业服务平台+PPT+论文+讲解+售后
  • Android 13 系统自定义安全水印
  • C# WCF服务(由于内部错误,服务器无法处理该请求。)
  • 利用github pages建立Serverless个人博客
  • Spring Boot 集成 sa-token 实践教程
  • CSS:盒子模型
  • django中的cookie与session
  • 环形链表(判断链表中是否有环)的讲解
  • NLP(14)--文本匹配任务
  • MySQL——系统变量
  • 「 网络安全常用术语解读 」漏洞利用预测评分系统EPSS详解
  • 理解python中的Iterator 和 Iterable 迭代器和可迭代对象
  • C语言实现动态加载.so动态库,使用,错误捕获以及卸载
  • 《动手学深度学习》V2(11-18)
  • web前端之excel转pdf、小黄人发送请求、base64、jspdf、xlsx
  • 【面试题】音视频流媒体高级开发(2)
  • 数据与结构--堆
  • Github的使用教程(下载项目、寻找开源项目和上传项目)
  • Linux-线程概念
  • js的桶排序