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

算法知识点————背包问题

万能头文件#include<bits/stdc++.h>

01 背包

定义: 物品只能用1次。01对应选还是不选第i个物品 .N个物品、V容量的最大价值。
思路:
(1)f[ i ] [j] 表示前i个物品容量j的最大价值。

(2)当前背包容量不够(j < V[i]),不能选i了,此时最大价值是前i-1和物品的最大价值。f[i] [j] = f[i-1] [j]

(3) 容量够用。可以选i也可以不选i。

选i。f[i] [j] = f[i-1] [j-V[i]] + w[i]

不选i。f[i] [j] = f[i-1] [j]

这两种情况取最值max()

#include<bits/stdc++.h>
using namespace std;
const int MAXX = 1010;
int f[MAXX][MAXX];//f[i][j] 前i个物品容量j的最大价值
int v[MAXX]; // 体积
int w[MAXX]; // 价值
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=1;j<=m;j++){if(j < v[i]){//此时不能装下第i个物品,最优解是前i-1的最优解f[i][j] = f[i-1][j];}else{f[i][j] = max(f[i-1][j],f[i-1][j-v[i]] + w[i]);//此时能装下第i个物品但是选不选i这个物品这两种情况的价值要取最大的}}}cout<<f[n][m]<<endl;return 0;
}

优化:成一维

(1) f[j] 容量j下的最优解

(2)这里的j应该逆序更新

(3) f[j] = max(f[j] , f[j-v[i] ] + w[i] )

#include<bits/stdc++.h>
using namespace std;
const int MAXX = 1010;
int f[MAXX];//f[j] 容量j的最大价值
int v[MAXX]; // 体积
int w[MAXX]; // 价值
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=m;j>=0;j--){for(int j=m;j>= v[i];j--){//if(j < v[i]){//此时不能装下第i个物品,最优解是前i-1的最优解// f[j] = f[j];// }else{f[j] = max(f[j],f[j-v[i]] + w[i]);//此时能装下第i个物品但是选不选i这个物品这两种情况的价值要取最大的// }}}cout<<f[m]<<endl;return 0;
}

优化输入

#include<bits/stdc++.h>
using namespace std;
const int MAXX = 1010;
int f[MAXX];//f[j] 容量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++){int v,w;cin>>v>>w;//一边输入一边处理for(int j=m;j>= v;j--){f[j] = max(f[j],f[j-v] + w);//此时能装下第i个物品但是选不选i这个物品这两种情况的价值要取最大的}}cout<<f[m]<<endl;return 0;
}

完全背包问题

定义:每种物品都有无限件可用。

一维结论是for(int j=m;j>= v[i];j–){这里面是正向for(int j=v[i] ;j<=m;j++)

01背包区别:f[i] [j] = max(f[i-1] [j] , f[i-1] [j-v[i]] +w[i])

完全背包区别:f[i] [j] = max(f[i-1] [j] ,f[i] [j-v[i]] +w[i])

#include<bits/stdc++.h>
using namespace std;
const int MAXX = 1010;
int f[MAXX];
int v[MAXX];
int w[MAXX];
int main(){int n,m;cin>>n>>m;for(int i=0; i<n; i++){cin>>v[i]>>w[i];}for(int i=0;i<n;i++){for(int j=v[i];j<=m;j++){//这里正序f[j] = max(f[j],f[j-v[i]] + w[i]);}}cout<<f[m]<<endl;return 0;
}

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 时间序列预测学习方向总概括
  • Python基础语法(1)
  • 已知两圆的圆心半径,求交点坐标——CAD VBA 解决
  • 1-【JavaWeb】数据库基础
  • 生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute
  • java中redis集群模式和哨兵模式的区别和联系?
  • Java:动态代理
  • CSP-CCF★★★201812-2小明放学★★★
  • Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】
  • ABAP JSON处理应用
  • CKAD-CronJob
  • 伟易特发布全新一代便携式反无人机装备
  • Vue组件:动态组件、缓存组件、异步组件
  • CentOs7 解决yum更新源报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。
  • 微信小程序登录与获取手机号 (Python)
  • 时间复杂度分析经典问题——最大子序列和
  • [case10]使用RSQL实现端到端的动态查询
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Git同步原始仓库到Fork仓库中
  • Iterator 和 for...of 循环
  • JAVA之继承和多态
  • Logstash 参考指南(目录)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • node入门
  • spring security oauth2 password授权模式
  • SpringBoot 实战 (三) | 配置文件详解
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue数据传递--我有特殊的实现技巧
  • vue自定义指令实现v-tap插件
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于Java中分层中遇到的一些问题
  • 如何用vue打造一个移动端音乐播放器
  • 责任链模式的两种实现
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​iOS安全加固方法及实现
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #Linux(权限管理)
  • (1)虚拟机的安装与使用,linux系统安装
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (javaweb)Http协议
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (分布式缓存)Redis持久化
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (论文阅读40-45)图像描述1
  • (十一)手动添加用户和文件的特殊权限
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net IE10 _doPostBack 未定义
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • @Autowired自动装配
  • @Controller和@RestController的区别?