一、多重背包问题1

ACwing 4.多重背包问题I

一、状态表示

f[i][j],表示从前i个物品当中选,总体积不超过j的选法,求解的是最大值

二、集合划分

f[i][j]根据第i见物品选择的数量进行划分,f[i-1][j],f[i-1][j-v]+w,f[i-1][j-2*v]+2 * w....

三、转移方程

f[i][j] = max(f[i][j],f[i-1][j-kv] + k * w)

代码:

#include <iostream>
using namespace std;int n,m;
const int N = 110;
int f[N][N],v[N],w[N],s[N];int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++){scanf("%d%d%d",&v[i],&w[i],&s[i]);}for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++){for(int k = 0;k <= s[i] && k * v[i] <= j;k++){f[i][j] = max(f[i][j],f[i - 1][j - k * v[i]] + k * w[i]);}}printf("%d",f[n][m]);return 0;
}

方法二:将多重背包问题转化成01背包问题:

#include <iostream>
using namespace std;const int N=10010;
int a[N],b[N],f[N];
int n,m,v,w,s,t;int main()
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++){cin>>v>>w>>s;while(s--){a[++t]=v;b[t]=w;}//死拆,把多重背包拆成01背包}for(int i=1;i<=t;i++)for(int j=m;j>=a[i];j--){f[j]=max(f[j],f[j-a[i]]+b[i]);}cout<<f[m];return 0;
}

二、多重背包问题2

ACwing5

本题的背景和上一道题完全一样,但是进行了数据的加强,如果采用上一个题的方法,时间复杂度为10^9明显会超时。因此得想办法进行优化,采用二进制优化,

代码如下,采用二进制优化后转化为01背包问题、

#include <iostream>
using namespace std;
#define N 12000//N*logs(注意是以2为底,s的对数)=1000*log2000≈11000,开15000保险
#define M 2010
int n,m;
int v[N],w[N];
int dp[N];//01背包优化,用一维数组
int main()
{int a,b,s;cin>>n>>m;int cnt=0;//存储新物品的编号/*多重背包二进制优化操作*/for(int i=1;i<=n;++i){cin>>a>>b>>s;//第i种物品的体积,价值,数量int k=1;while(k<=s){v[++cnt]=a*k, w[cnt]=b*k, s-=k, k*=2;}if(s>0) { v[++cnt]=a*s, w[cnt]=b*s; }}/*01背包*/n=cnt;//更新物品数量,此时为若干个新物品for(int i=1;i<=n;++i){for(int j=m;j>=v[i];--j)dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}cout<<dp[m]<<endl;return 0;
}

动态规划:多重背包问题相关推荐

  1. 动态规划——多重背包问题

    多重背包问题: 给定一个有一定容量的背包,和n个物品,每个物品有si件. 每个物品有其对应的体积和价值. 问背包最多能装下的物品的最大价值为多少. 输入格式: 第一行两个整数,N,V,分别表示物品数量 ...

  2. 动态规划 多重背包问题

    多重背包问题 I 有 N 种物品和一个容量是 V 的背包. 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大. ...

  3. 九十、动态规划系列背包问题之多重背包

    @Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...

  4. 动态规划解二维多重背包问题

    背包问题 背包问题是一个很经典的算法问题,根据其复杂程度不同又可分为01背包问题.完全背包问题.多重背包问题.二维背包问题等等.本文讲一讲二维多重背包问题的动态规划解法. 01背包问题 有N件物品和一 ...

  5. java多重背包算法,【动态规划】多重背包问题

    说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...

  6. 动态规划之背包问题---01背包---完全背包---多重背包

    本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...

  7. 背包问题(01背包问题,多重背包问题,完全背包问题)——基于python的动态规划

    1. 0-1背包问题 1.1 题目描述 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少 ...

  8. python多重背包_【动态规划】多重背包问题

    说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...

  9. python多重背包_多重背包问题(python实现),动态规划

    多重背包问题 感谢这些朋友们的文章,给了我很大启发: https://blog.csdn.net/songyunli1111/article/details/94778914 https://blog ...

最新文章

  1. numpy数组统计函数amin() amax()
  2. 解决The current branch is not configured for pull No value for key branch.master.merge found in confi
  3. Python学习中的点点滴滴
  4. 计算机背景为什么总是黑色,电脑背景变成黑色的了是为什么
  5. android定义 task,Android Gradle 自定义Task 详解
  6. python和java学哪个好-Python和Java两门编程语言,学习哪个更好?
  7. 【2016北京集训】魔法游戏
  8. Pytorch中view, transpose, permute等方法的区别
  9. iOS贝塞尔曲线(UIBezierPath)的基本使用方法
  10. 【语音隐写】基于matlab小波变换算法求解水印嵌入提取【含Matlab源码 513期】
  11. 更改 Normal 模板 (Normal.dotm)
  12. 大牛直播SDK(android/iOS部分)最新功能列表
  13. 新疆公需课继续教育答案 自动获取
  14. vmd python 命令_【MMD】用python解析VMD格式读取
  15. MT4单均线变色代码实例
  16. 数据库 SQL 语句学习
  17. PCI总线的旧计算机,游戏卡成幻灯片 旧电脑升级显卡应该注意什么?
  18. 计算机下桌面显示不出来,电脑桌面文档不会在右边显示出来怎么办
  19. 帝国cms支付系统的漏单风险
  20. 微前端在得物客服域的实践/那么多微前端框架,为啥我们选Qiankun + MF

热门文章

  1. 8 Latters 英文歌词
  2. [006] [ESP32开发笔记] 使用Flash下载工具烧录固件步骤
  3. Electron 项目(三):本地日志(electron-log)
  4. 2023Track Tech防伪溯源技术展 | 防伪溯源 | 智慧包装 | 安全印刷
  5. 了解的CAP和BASE等理论
  6. Python3爬取今日头条文章视频数据,完美解决as、cp、_signature的加密方法(2020-6-29版)
  7. 2005.3.28 星期一 多云/晴
  8. 红米note10是双卡双待吗 红米note10是5g手机
  9. 献给阿尔吉侬的花束(bfs经典例题)
  10. 浙江大学公开课:博弈论基础良句收录和观后观想