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. shell脚本备份nginx日志

    vim /data/runlog.sh                                                  #编辑一个 shell 脚本 #!/bin/bash LOGP ...

  2. NodeJS学习笔记 (19)进阶调试-debugger(ok)

    写在前面 谈到node断点调试,目前主要有三种方式,通过node内置调试工具.通过IDE(如vscode).通过node-inspector,三者本质上差不多.本文着重点在于介绍 如何在本地通过nod ...

  3. python之禅---对象与元类

    众所周知,python是一门面向对象的编程语言,python中一切皆对象,那么我们先探讨一下什么是对象. 一.对象 在生活中一个事物就是一个对象,比如:一只猫就是一个对象,猫的体型.猫毛的颜色等是它的 ...

  4. 【问题:SSH】win10使用SSH链接服务器时,提示:Host key verification failed

    异常原因:当前连接新建的验证信息与之前保存的验证信息不一致,将原来的验证信息删除就可以了. 1 使用以下命令,清空之前缓存的信息.或者直接打开C:\Users\Nolan\.ssh\known_hos ...

  5. Python组织文件 实践:拷贝某种类型的所有文件

    #! python3 #chapter09-test01- 遍历目录树,查找特定扩展名的文件不论这些文件的位置在哪里,都将他们 #拷贝到一个新的文件夹中 import os,shutil,pprint ...

  6. 【Codeforces Round #422 (Div. 2) A】I'm bored with life

    [题目链接]:http://codeforces.com/contest/822/problem/A [题意] 让你求a!和b!的gcd min(a,b)<=12 [题解] 哪个小就输出那个数的 ...

  7. 解决Struts中文乱码问题总结

    在进行struts开发的过程中.总也是出现非常多的乱码问题.但归根究竟,也仅仅是下面三种情况:  ㈠页面显示中文乱码  ㈡传递參数中文乱码  ㈢国际化资源文件乱码  以下就这三中情况介绍怎么在详细项目 ...

  8. ALTERA器件中复位电路实现之-异步复位同步化

    所谓异步复位同步化,就是我们通常说的异步复位同步撤除. 为了避免纯粹的同步复位和纯粹异步复位的问题,可以使用一种叫做同步化的异步复位,我们称其为第三类复位.这种复位完全结合了异步复位和同步复位的优势, ...

  9. 洛谷P1586 四方定理

    题目描述 四方定理是众所周知的:任意一个正整数nn ,可以分解为不超过四个整数的平方和.例如:25=1^{2}+2^{2}+2^{2}+4^{2}25=12+22+22+42 ,当然还有其他的分解方案 ...

  10. 使用java自带的xml解析器解析xml

    使用java自带的xml解析器解析xml,其实我不推荐,可以用Dom解析,或其他的方式,因为Java自带的解析器使用不但麻烦,且还有bug出现. 它要求,针对不同的xml(结构不同),必须写对应的ha ...