牛牛的旅游纪念品 动态规划背包问题
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
牛牛在牛市的旅游纪念商店里面挑花了眼,于是简单粗暴的牛牛决定——买最受欢迎的就好了。
但是牛牛的背包有限,他只能在商店的n个物品里面带m个回去,不然就装不下了。
并且牛牛希望买到的纪念品不要太相似,所以导购小姐姐帮助牛牛把纪念品全部排成了一行,牛牛只需要让选出来要买的m个物品中任意两个的位置差都大于等于k就行了。
现在告诉你这n个物品排成一行之后的受欢迎程度(可能是负数),求牛牛带回去的m个物品的最大欢迎度之和。
输入描述:
第一行三个数n,m,k
接下来一行,有n个整数,是n个物品按顺序的受欢迎程度。
输出描述:
输出一个数为题目所求的最大和
示例1
输入
a4 2 2 2 4 -6 1
4 2 2 2 4 -6 1
输出
5
5
说明
n≤10000,m≤100,m≤nn\leq10000,m\leq100,m\leq nn≤10000,m≤100,m≤n,答案保证在int范围内,保证按照题目要求一定能取到m个物品
这是一道变形的背包问题,多了一个条件也就是选了一个之后那么接下来k-1个是不能选的。
因为必须要装满m个物品,这里一个物品相当于一个体积,以行为体积,列为物品建立二维数组,使用f[i][j]表示恰好装满j体积能够达到的最大价值。还是考虑选还是不选,如果不选那么当前价值就等于上一次装到相同体积价值的最大值也就是f[i-1][j],如果选当前物品,那么就要从第一个到当前物品位置k个之前里面选择最优并装进去(这里1到当前位置前k个的最优实际上已经存储在当前行的前k行这一行中)也就是f[i-k][j-1]+a[i],因此得出方程f[i][j]=max(f[i-1][j],f[i-k][j-1])。
特别的,这里是有正有负的,所以如果不进行初始化,那么如果全是负数就会出现最后全是0的情况,这是不正确的,因此要初始化为负无穷,还有就是对于不到k行的这些行数的初始化处理,这个区间中不可能出现选两个的情况,因而每一行就只需要初始化j=1的一列,也就是最多装一个,取到当前物品能装到的最大价值
下面是程序--->.
#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
#define r(i,a,b) for(int i=a;i<=b;i++)
ll a[10010];
ll f[10010][200];
int main()
{int n, m, k; scanf("%d%d%d", &n, &m, &k);r(i,1,n)scanf("%lld",a+i);//读入数据//初始化,这里因为有正有负,所以必须要初始化负无穷大for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {f[i][j] = -1e9;}}f[1][1] = a[1];r(i, 2, k)f[i][1] = max(f[i - 1][1], a[i]);r(i, k + 1, n) {for(int j=m; j>=1; j--)//如果j-1被装了东西,那么就可以开始计算装到j个物品后的价值,与之前装到那么j个物品对比if (f[i - k][j - 1] != -1e9)f[i][j] = max(f[i - 1][j], f[i - k][j - 1] + a[i]);f[i][1] = max(f[i-1][1], a[i]);//第一个肯定处理不到,所以特判一次}printf("%lld\n",f[n][m]);//输出答案return 0;
}
牛牛的旅游纪念品 动态规划背包问题相关推荐
- 贪婪算法、递归计算、动态规划背包问题
//贪婪算法计算背包问题public static double ksack(double[] values, double[] weights, int capacity){double load ...
- 动态规划——背包问题(01背包问题)
动态规划--背包问题(01背包问题) 01背包问题(求最大价值): 问题优化 01背包问题(求方案数): 动态规划--背包问题(01背包问题) 01背包问题(求最大价值): 有N件物品和一个最多能背重 ...
- 动态规划背包问题优化空间复杂度——滚动数组
动态规划背包问题优化空间复杂度--滚动数组 背包问题 空间复杂度优化 Java代码 链接:代码随想录背包问题 背包问题 背包问题是动态规划中基本的问题,我们考虑下面的简单问题: 假设背包容量为 ...
- 动态规划——背包问题(详解)
动态规划是我最早接触的算法,一开始非常简单,固定模板题,后来愈发愈发难起来了,条件,状态压缩等等,难点主要是,状态怎么表示,状态转移方程怎么写,这篇文章将会从背包五大问题详解,希望能帮助到大家去类比, ...
- 动态规划——背包问题
动态规划--背包问题 对于背包问题,今天我们先讲解,01背包,完全背包,和多重背包.我主要从: 什么题可以用背包问题解决 背包问题的模板细节,如何准确写出背包. 1.什么题可以用背包问题解决 看到题目 ...
- 动态规划背包问题详解(二)---0-1背包问题
/** * 对于技术面试,你还在死记硬背么? * 快来"播"沙糖橘吧, * 用视频案例为你实战解读技术难点 * 聚焦Java技术疑难点,实战视频为你答疑解惑 * 越&qu ...
- 【入门级】Java解决动态规划背包问题
目录 前言 动态规划背包问题是什么? 动态规划解题转代码 第一步:拆包填表格 第二步:转为代码 一.首先看空表格:即初始化代码 二.看怎么循环填表格 三.输出结果(最大价值) 第三步:完整代码 动态规 ...
- Java-算法-动态规划-背包问题
看完本篇文章可以再多练习相似题目 算法-动态规划-背包问题-附一 一. 背包问题介绍 1. 最原始的背包问题 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择 ...
- 动态规划---背包问题分析
0/1背包 问题描述 有N件物品和一个容量为V的背包,第i件物品的体积为c[i],价值为w[i].求将哪些物品放进背包可以使物品价值总和最大(有两种情况:不要求填满背包和填满背包). 每件商品只有一件 ...
- 动态规划 —— 背包问题 P09 —— 背包问题的变化
[输出方案] 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪 ...
最新文章
- 谷歌CEO皮猜致歉,被解雇的AI伦理研究员:根本没有认错
- 谷歌发文回顾2018年AI进展:让AI人人可用!
- 大战即将来临,柯洁将于5月与AlphaGo正式对决
- 给医生的R语言课程:零基础入门篇
- AI成为世界互联网大会重要议题 第四范式AutoML登上央视
- 【数学基础】参数估计之极大似然估计
- java开发微信公众平台备忘
- springboot starter的一个问题
- SVG 学习四 基础API
- 7位双极性序列 matlab,matlab仿真-bpsk调制
- 计算机桌面任务栏窗口对话框菜单的功能,电脑下方的任务栏不显示怎么办 在任务栏和开始菜单属性对话框...
- java deff_java – 在配置中添加时出现Spring NoClassDefF...
- SpringMvc下载文件损坏
- 雷军:《我十年的程序员生涯》系列之二:我赚的第一桶金
- inter uhd graphics630显卡驱动_Intel新驱动已支持Win10 H2更新、11代酷睿狂喜
- 一款非常不错的高仿UC浏览器源码下载
- Negroni源码分析
- Vue项目启动内存溢出 js stack overflow
- html字体下划线取消,取消下划线与显示下划线设置
- JS实现奇偶数的判断
热门文章
- ospfdr选举规则_DR/BDR详细选举过程
- Error:(3, 50) java: 程序包com.n.c.caa.cds.commons.constants不存在
- 关于读书学习与思考力。 文/江湖一剑客
- 通过ffmpeg生成AAC数据
- 网络综合布线线缆如何敷设布放_网络线和综合布线施工技术交底
- 让你两分钟明白什么是ERP
- 跟着吴恩达学习机器学习 2代价函数
- riser服务key/value服务介绍-基于leveldb
- Stealing packets
- 康耐视InSight软件电子表格视图功能介绍