Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

小X来到一个雄奇的金字塔挖宝,但是这是一座被诅咒的金字塔,小X必须马上逃离这里,否则小X就会被埋在金字塔里,但他不希望此行落空。 

现在小X面前有N+1种财宝,每种财宝都有一个价值。第一种财宝重量为0,第二种财宝重量为1,总之第I种财宝重量为I-1。现在小X希望

拿走N+M个物品,但是这M+N个物品总重量不能超过N。小X希望能获得最大的价值。你能帮帮他吗?

由于金字塔跟小X一样牛,所以每种财宝无限个。

【输入格式】

第一行两个正整数N,M 第二行N+1个整数,第I个整数代表了第I种财宝的价值

【输出格式】

一个数,表示最大利润。

【数据规模】

10%满足N,M<=10 40%满足N,M<=100 100%满足 N,M<=3000 abs(财宝价值)<=1000

Sample Input1

5 3
4 7 2 5 -3 6

Sample Output1

47

【题解】

这题有两个很烦人的地方,一个是m+n个物品的限制。一个是重量为0的物品。

我们要怎么去除掉这个问题呢。

首先考虑一下最后我们选取的物品。

因为规定了要选m+n个物品。如果不选重量为0的物品可能会出现选不够的问题。

因此必然是掺杂着重量为0和重量不为0的物品。设为x,y.

设重量为0的物品下标为0,重量不为0的物品下标为1..n;

c是物品价值数组,w是物品的重量数组。

最后的答案 == x*c[0] + y*c[0] +∑(c[i]) - y*c[0]  (其中的求和为所选出的最优的y个有重量的物品的价值的和);

但是先别急着划掉两个y*c[0];

我们合并一下。ans == (x+y)*c[0] + ∑(c[i]) - y*c[0];

其中x+y==n+m;

ans == (n+m)*c[0] +
∑(c[i]) - y*c[0];

其中左边绿色部分为常量,右边为需要求的量。

因为∑(c[i])一共求和了y(未知)个c[i],则可以再化一下。

ans == 常量 + ∑(c[i]-c[0]) i∈【1,n】

这下问题就变成求物品重量为w[i],价值为c[i]-c[0]的完全背包问题了。

右边最大则ans最大。

还有一个优化的方法。即如果c[i]-c[0]是小于0的,那么这个物品就不要了。

因为如果c[i]比c[0]还小,那么拿不用重量的物品来替代i物品肯定最优。(c[0]不用消耗重量!)

【代码】

#include <cstdio>

int n,m,temp,num = 0,f[3011],w[3011],c[3011];

void input_data()
{
scanf("%d%d",&n,&m);
scanf("%d",&temp); //读入c[0]
for (int i = 1;i <= n;i++)
{
int x;
scanf("%d",&x);
x -= temp; //输入第i个物品的价值,先减去c[0]
if (x > 0) //如果减去后还大于0则这个物品是可能在y个物品中的。
{
num++;
w[num] = i;
c[num] = x;
}
}
} void get_ans()
{
for (int i = 1;i <= num;i++) //对c[i]-c[0] (i∈[1..n]) 进行完全背包的过程
for (int j = w[i];j <= n;j++)
if (f[j] < f[j-w[i]] + c[i])
f[j] = f[j-w[i]] + c[i];
} void output_ans()
{
printf("%d",f[n] + (n+m)*temp); //最后输出f[n]的时候还要加上被减去的y个c[0]。以及x个c[0];
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}

【t038】&&【u214】金字塔的更多相关文章

  1. Atitit.软件开发的三层结构isv金字塔模型

    Atitit.软件开发的三层结构isv金字塔模型 第一层,Implements 层,着重与功能的实现.. 第二次,spec层,理论层,设计规范,接口,等.流程.方法论 顶层,val层,价值观层,原则, ...

  2. 在Excel中制作金字塔条形图

    使用场景:一项市场调查研究中,男性和女性.赞同和反对.满意和不满意的两方面的消费者,他们在某些项目上的指标分布特性一项产品组合决策中,乐观场景和悲观场景下各产品的获利情况一个产品试销活动中,不同门店渠 ...

  3. SIFT中的尺度空间和传统图像金字塔

    SIFT中的尺度空间和传统图像金字塔 http://www.zhizhihu.com/html/y2010/2146.html 最近自己混淆了好多概念,一边弄明白的同时,也做了一些记录,分享一下.最近 ...

  4. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  5. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  6. Spatial pyramid pooling (SPP)-net (空间金字塔池化)笔记(转)

    在学习r-cnn系列时,一直看到SPP-net的身影,许多有疑问的地方在这篇论文里找到了答案. 论文:Spatial Pyramid Pooling in Deep Convolutional Net ...

  7. php——用for循环打印半金字塔、金字塔、正方形、倒金字塔、菱形、空心图形等

    1.半金字塔 $n=5; //控制层数 for($i=1;$i<=$n;$i++){ //控制每层的 “*” 数 for($j=1;$j<=$i;$j++){ echo  "*& ...

  8. JAVA WEB 的JSP(9*9乘法表+*型金字塔)

    运行环境及工具: (Tomcat7) + (JAVA JDK)+ (Eclipse for J2EE) 输出9*9乘法表 代码片段的练习 增加一些简单的JS功能 <%@ page import= ...

  9. OpenCV3编程入门笔记(4)腐蚀、膨胀、开闭运算、漫水填充、金字塔、阈值化、霍夫变换

    腐蚀erode.膨胀dilate 腐蚀和膨胀是针对图像中的白色部分(高亮部分)而言的,不是黑色的.除了输入输出图像外,还需传入模板算子element,opencv中有三种可以选择:矩形MORPH_RE ...

随机推荐

  1. python 基础使用list、dict、set、可变与不可变对象

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448 dict是字典,可以储存键值对类型的值,set与dict ...

  2. 我的CSDN原创高质量免积分下载资源列表(持续更新)

    最近几个月,我在CSDN平台,发表了大量原创高质量的项目,并给出了相应的源码.文档等相关资源. 为了方便CSDN用户或潜在需求者,下载到自己想要的资源,特分类整理出来,欢迎大家下载. 我的原则:原创高 ...

  3. 洛谷—— P2934 [USACO09JAN]安全出行Safe Travel || COGS ——279|| BZOJ——1576

    https://www.luogu.org/problem/show?pid=2934 题目描述 Gremlins have infested the farm. These nasty, ugly ...

  4. HTML学习----------DAY2第四节

    HTML 文档是由 HTML 元素定义的. HTML 元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening ...

  5. maven中使用mybatis

    1.Mybatis优缺点 优点: Mybatis实现了对Dao层的封装,隔离了SQL语句,便于管理,避免了像JDBC那样操作数据集,便于扩展等等. 缺点: Mybatis属于?半自动“ORM”,比Hi ...

  6. cocoapods的安装,使用,卸载,以及你可能会遇到的坑..

    首先, 不会用cocoapods的话如过你接手某些新项目是用cocoapods写的你会疯, 其次他真的非常好用, 当然某些坑也是存在的,比方你用它导入了AFNetwork然后你须要改动一些AF的内部的 ...

  7. json的键为变量而不是字符串时,怎么写?

    看栗子 /* 首先你创建了一个window的属性叫b, 并给它赋值为'cccddd' * 然后你创建了一个对象"a", 声明了一个它的属性叫b, 并且给b赋值为6 * 注意第一行的 ...

  8. 有关error PRJ0003错误的思考

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天同事遇到两个编译错误: 项目: error PRJ0003 : 生成"rc.exe"时出错. ...

  9. Right turn(四川省第七届)

    Right turn Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class n ...

  10. js002---- 标准内置对象

    1. js全局的对象(全局作用域里的对象,而不是全局对象), 或者叫标准内置对象 2, 全局对象  是一个Global类的对象. 标准内置对象的分类: 1. 值属性 infinity       Na ...