动态规划:多重背包问题
一、多重背包问题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;
}
动态规划:多重背包问题相关推荐
- 动态规划——多重背包问题
多重背包问题: 给定一个有一定容量的背包,和n个物品,每个物品有si件. 每个物品有其对应的体积和价值. 问背包最多能装下的物品的最大价值为多少. 输入格式: 第一行两个整数,N,V,分别表示物品数量 ...
- 动态规划 多重背包问题
多重背包问题 I 有 N 种物品和一个容量是 V 的背包. 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大. ...
- 九十、动态规划系列背包问题之多重背包
@Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...
- 动态规划解二维多重背包问题
背包问题 背包问题是一个很经典的算法问题,根据其复杂程度不同又可分为01背包问题.完全背包问题.多重背包问题.二维背包问题等等.本文讲一讲二维多重背包问题的动态规划解法. 01背包问题 有N件物品和一 ...
- java多重背包算法,【动态规划】多重背包问题
说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...
- 动态规划之背包问题---01背包---完全背包---多重背包
本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...
- 背包问题(01背包问题,多重背包问题,完全背包问题)——基于python的动态规划
1. 0-1背包问题 1.1 题目描述 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少 ...
- python多重背包_【动态规划】多重背包问题
说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...
- python多重背包_多重背包问题(python实现),动态规划
多重背包问题 感谢这些朋友们的文章,给了我很大启发: https://blog.csdn.net/songyunli1111/article/details/94778914 https://blog ...
最新文章
- numpy数组统计函数amin() amax()
- 解决The current branch is not configured for pull No value for key branch.master.merge found in confi
- Python学习中的点点滴滴
- 计算机背景为什么总是黑色,电脑背景变成黑色的了是为什么
- android定义 task,Android Gradle 自定义Task 详解
- python和java学哪个好-Python和Java两门编程语言,学习哪个更好?
- 【2016北京集训】魔法游戏
- Pytorch中view, transpose, permute等方法的区别
- iOS贝塞尔曲线(UIBezierPath)的基本使用方法
- 【语音隐写】基于matlab小波变换算法求解水印嵌入提取【含Matlab源码 513期】
- 更改 Normal 模板 (Normal.dotm)
- 大牛直播SDK(android/iOS部分)最新功能列表
- 新疆公需课继续教育答案 自动获取
- vmd python 命令_【MMD】用python解析VMD格式读取
- MT4单均线变色代码实例
- 数据库 SQL 语句学习
- PCI总线的旧计算机,游戏卡成幻灯片 旧电脑升级显卡应该注意什么?
- 计算机下桌面显示不出来,电脑桌面文档不会在右边显示出来怎么办
- 帝国cms支付系统的漏单风险
- 微前端在得物客服域的实践/那么多微前端框架,为啥我们选Qiankun + MF
热门文章
- 8 Latters 英文歌词
- [006] [ESP32开发笔记] 使用Flash下载工具烧录固件步骤
- Electron 项目(三):本地日志(electron-log)
- 2023Track Tech防伪溯源技术展 | 防伪溯源 | 智慧包装 | 安全印刷
- 了解的CAP和BASE等理论
- Python3爬取今日头条文章视频数据,完美解决as、cp、_signature的加密方法(2020-6-29版)
- 2005.3.28 星期一 多云/晴
- 红米note10是双卡双待吗 红米note10是5g手机
- 献给阿尔吉侬的花束(bfs经典例题)
- 浙江大学公开课:博弈论基础良句收录和观后观想