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

动态规划之 0-1背包 完全背包 多重背包 混合背包

0-1背包 每件物品 只能取1件

完全背包 每件物品 不限制数量

多重背包 每件物品 限制数量

混合背包 每件物品 限制数量 或 不限制数量

后边的背包问题,都在 0-1背包思路上的延伸

完全背包问题,要会三重循环的写法,

多重背包 和 混合背包,在完全背包问题的三重循环写法上 加个判断条件即可!

#include <bits/stdc++.h> using namespace std; int w[31],c[31],p[31]; int mx,n; int D01(int m){//01背包问题 int dp[201]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=m;j>=0;j--){ if(j-w[i]>=0)dp[j]=max(dp[j],dp[j-w[i]]+c[i]); } } return dp[m]; } int D1(int m){//完全背包 三层循环 二维数组 int dp[31][201]; memset(dp,0,sizeof(dp)); // for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ for(int k=0;k*w[i]<=j;k++){ dp[i][j]=dp[i-1][j]; if(j>=k*w[i])dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*c[i]); } } } return dp[n][m]; } int D2(int m){// 与D1 一样,只是代码简化一些 int dp[31][201]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ for(int k=0;k*w[i]<=j;k++){ dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*w[i]]+k*c[i]); } } } return dp[n][m]; } int D3(int m){//完全背包 三层循环 滚动数组,在D2基础上 优化空间 int dp[201]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=m;j>=0;j--){ for(int k=0;k*w[i]<=j;k++){ dp[j]=max(dp[j],dp[j-k*w[i]]+k*c[i]); } } } return dp[m]; } int D3A(int m){//多重背包 在D3基础上 K循环里加了一个 (k<=p[i]) 数量限制 int dp[201]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=m;j>=0;j--){ //在完全背包的基础上 加了 k<=p[i] for(int k=0;k*w[i]<=j && (k<=p[i]);k++){ dp[j]=max(dp[j],dp[j-k*w[i]]+k*c[i]); } } } return dp[m]; } int D3B(int m){//混合背包 在D3A基础上 K循环里加了一个 p[i]==0 , int dp[201]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=m;j>=0;j--){ for(int k=0;k*w[i]<=j && (k<=p[i] || p[i]==0);k++){ dp[j]=max(dp[j],dp[j-k*w[i]]+k*c[i]); } } } return dp[m]; } int D4(int m){//完全背包 二层循环 滚动数组 int dp[201]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ if(j-w[i]>=0)dp[j]=max(dp[j],dp[j-w[i]]+c[i]); } } return dp[m]; } int main(int argc, char** argv) { cin>>mx>>n; if(0){//01背包问题 和 全背包 for(int i=1;i<=n;i++){ cin>>w[i]>>c[i]; } } else{//多重背包 for(int i=1;i<=n;i++){ cin>>w[i]>>c[i]>>p[i]; } } //cout<<D01(mx);//01背包问题 //完全背包 //cout<<"max="<<D1(mx); //cout<<"max="<<D2(mx); //cout<<"max="<<D3(mx); //cout<<"max="<<D4(mx); //混合背包 cout<<D3B(mx);//混合背包 return 0; }
http://www.jsqmd.com/news/543652/

相关文章:

  • 5分钟掌握游戏高清截图秘诀:SRWE窗口分辨率自定义完整教程
  • 3步实现手游PC级操控:QtScrcpy键鼠映射技术全解析
  • 基于博途Advanced中符号IO域实现画面切换
  • CodaYun 免费在线编辑器,让创作与存储告别繁琐,轻松拿捏高效工作流
  • Open XML SDK深度实战指南:高效处理Office文档的核心架构与最佳实践
  • 深度架构解析:TranslucentTB运行时依赖问题的系统级解决方案
  • QLVideo终极指南:让macOS Finder完美预览所有视频格式
  • 宝塔webHook自动拉取代码脚本---前端编译
  • 从MFCC到LFCC与CQCC:基于librosa的音频特征提取进阶实践
  • AI编程助手隐私安全怎么做?opencode离线运行部署实战
  • 突破语言壁垒:XUnity.AutoTranslator的创新解决方案
  • 数据主权视角下的微信聊天记录管理方案:WeChatMsg技术实践指南
  • 【从零开始】手写BLE协议栈(0-1)开篇与硬件选型
  • FastAPI 2.0流式响应为何卡在3.2s?架构设计图曝光底层uvicorn worker阻塞链路,3步优化实现端到端<200ms延迟
  • 如何通过自动化工具高效获取阴阳师游戏资源?完整实践指南
  • OpenClaw多端同步:Qwen3-VL:30B在飞书移动端与PC端的体验
  • Java高级工程师金三银四面试题总结及参考答案
  • 5大核心技术揭秘:LibreCAD如何构建免费开源的2D CAD解决方案
  • YOLOv11涨点改进| MICCAI 2025 | 全球独家创新、特征融合改进篇| 引入DSEB双选择增强融合模块,通过边缘增强与差分注意力机制联合建模特征,适合医学图像分割、目标检测、语义分割涨点
  • 面试必备:Floyd判圈法在链表环检测中的5种应用场景(附LeetCode真题解析)
  • Local SDXL-Turbo实战案例:独立游戏开发者实时生成UI图标变体
  • 软考真题:信息系统项目管理师 2025年上半年(第1批) 综合知识
  • 3步完成Logisim-evolution开源工具安装:跨平台数字电路设计效率指南
  • OpenClaw智能提醒:nanobot生日管家实战开发
  • 云容笔谈惊艳案例:二十四节气系列人像,AI理解‘惊蛰’‘霜降’等文化隐喻
  • 如何轻松解决Unity WebGL输入法难题:5分钟快速配置指南
  • Outfit字体:现代品牌设计的几何无衬线字体解决方案
  • LFM2.5-1.2B-Thinking-GGUF入门必看:为什么轻量模型+Thinking机制更适合确定性任务
  • MacBook Pro本地部署OpenClaw:百川2-13B量化模型7×24小时运行方案
  • LFM2.5-1.2B-Thinking-GGUF镜像免配置:内置GGUF+llama.cpp+Web UI三位一体开箱即用