http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3956

题意:就是给你Hi,Ci的值,问怎么取使得下面那个式子的值最大:

  

理解:当时做了好久以为是贪心>_<.后来看别人的题解发现是01背包,现在学了01背包以后看就好理解多了。

因为每个值都是取或不取,所以容易想到是01背包。而且Hi的范围是[1,10000],Ci的范围是[1,100],n是[1,500],所以明显可以发现Ci适合做“物品体积”,Hi做“物品价值”,ΣCi做背包容量。由上式可知,若使式子的值越大,则ΣHxi越大越好,那么就01背包后判断一下就好。

这个背包想法很灵活,我刚开始就没明白为啥把Hi当做容量进行01背包。现在想想应该就是根据式子能得出ΣHxi越大越好,那么就需要用一种办法求得在条件内使得ΣHxi尽量最大化,所以想到01背包,把Hxi当做价值,那么自然ΣCi就应该当做背包容量,Ci当做体积,从数据范围也能看出这一点。背包完了之后,就依次判断当前容量为i(此时获得ΣHxi为f[i])时求得的上式的值,取个最大的就好。

参考代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=;
ll f[maxn];
int c[],h[];
int n; int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(f,,sizeof(f));
scanf("%d",&n);
ll sum=;
for (int i=;i<=n;i++){
scanf("%d%d",&h[i],&c[i]);
sum+=c[i];//每次累加c[i],求得总共的背包容量
} for (int i=;i<=n;i++){
for (int j=sum;j>=c[i];j--){
f[j]=max(f[j],f[j-c[i]]+h[i]);//一维滚动数组优化空间,求当前容量能装多少Hi。
}
} ll ans=;
for (int i=;i<=sum;i++){
ans=max(ans,f[i]*f[i]-f[i]*i-i*i);//求容量为i(ΣCxi),装了f[j](ΣHxi)这么多Hi时,式子的最大值。
}
printf("%lld\n",ans);
}
return ;
}

ZOJ 3956 Course Selection System [01背包]的更多相关文章

  1. ZOJ - 3956 Course Selection System 【01背包变形】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3956 题意 给出N组Hi Ci 然后 要选出若干个 使得 这个式 ...

  2. ZOJ 3956 Course Selection System 背包DP

    ZOJ3956 观察数据范围, c的值非常小 只有100 所以c的和也很有限 只有50000 是否可以从这里下手? 对于某一个c的和 我们一定希望h的和最大 才有可能是最终答案. 于是有了类似背包的d ...

  3. ZOJ 3956 Course Selection System

    题意 有n节课可供选择,每节课都有两个值Hi和Ci,如果学生选择了m节课(x1,x2,....,xm),则它的舒适值被定义为: //这里没有公式((lll¬ω¬)),因为那个图片我保存不下来≧ ﹏ ≦ ...

  4. ZOJ 3211 Dream City DP 01背包 经典问题

    题目大意:JAVAMAN 到梦幻城市旅游见到了黄金树,黄金树上每天回结出金子.已经有n棵树,JAVAMAN要停留m天,每天只能砍掉一棵树,砍掉树后就能得到树上的黄金.给定n棵树上原有的黄金a[i]和每 ...

  5. DP专题·三(01背包+完全背包)

    1.hdu 2126 Buy the souvenirs 题意:给出若干个纪念品的价格,求在能购买的纪念品的数目最大的情况下的购买方案. 思路:01背包+记录方案. #include<iostr ...

  6. dp ZOJ 3956

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3956 Course Selection System Time Limit ...

  7. Course Selection System ZOJ - 3956 01背包+思维

    Course Selection System ZOJ - 3956 这个题目居然是一个01背包,我觉得好难想啊,根本就没有想到. 这个题目把题目给的转化为  ans = a*a-a*b-b*b 这个 ...

  8. ZOJ-3956 Course Selection System,01背包!

    Course Selection System 比赛的时候最后20分钟想到了是01背包,奈何没时间推出怎么背. 题意:n门课程,每门课程都有一个h值和c值,现在给出一个happy的定义,所选的课程的h ...

  9. zoj 2822 Sum of Different Primes (01背包)

    ///给你n 求他能分解成多少个的不同的k个素数相加之和 ///01背包,素数打表 # include <stdio.h> # include <algorithm> # in ...

随机推荐

  1. JavaWeb-类加载器-注解-动态代理

    (一)类加载器 1.什么是类加载器,作用是什么? 类加载器就加载字节码文件(.class) 2.类加载器的种类 类加载器有三种,不同类加载器加载不同的 1)BootStrap:引导类加载器:加载都是最 ...

  2. Go之路之go语言结构

    Go Hello World 实例 package main //定义了包名,必须在源文件中非注释的第一行指名这个文件属于哪个包,每个Go应用程序都包含一个名为main的包 import " ...

  3. 设置mysql二进制日志过期时间

    ((none)) > show variables like 'expire_logs_days'; +------------------+-------+ | Variable_name | ...

  4. Redis源码解析:21sentinel(二)定期发送消息、检测主观下线

    六:定时发送消息 哨兵每隔一段时间,会向其所监控的所有实例发送一些命令,用于获取这些实例的状态.这些命令包括:"PING"."INFO"和"PUBLI ...

  5. 修改代码150万行!与 Blink 合并后的 Apache Flink 1.9.0 究竟有哪些重大变更?

    8月22日,Apache Flink 1.9.0 正式发布,早在今年1月,阿里便宣布将内部过去几年打磨的大数据处理引擎Blink进行开源并向 Apache Flink 贡献代码.当前 Flink 1. ...

  6. 用reduce装逼 之 多个数组中得出公共子数组,统计数组元素出现次数

    昨天做了一道美团的面试题,要求是给N个数组,找出N个数组的公共子数组. ,,,,]; ,,,,]; ,,,,]; ,,,,]; 以上四个数组,有公共子数组2, 3,7 function main(){ ...

  7. Python缩进和选择

    Python缩进和选择 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这 ...

  8. mysql基础记录

    1. 概念介绍 数据库:专门存储数据,存储数据的仓库,同时提供了对数据的操作方法,增删改查的方法 事务 事务:是作为一个单元的一组有序的数据库操作,如果组当中所有操作都成功,则事务执行成功,如果有一个 ...

  9. 根据一个分类id 获取这个分类底下所有子分类的商品信息,根据下面方法查询出所有有关分类id 再 根据这些id去商品表里查询所有商品信息

    /** * 检测该分类下所有子分类,并输出ID(包括自己) * 数据库字段 catid pid */ function getChildrenIds ($sort_id){ include_once ...

  10. android rsa 示例

    1.参考资料 1.1 android的Cipher官方文档 https://developer.android.com/reference/javax/crypto/Cipher 其中 构造Ciphe ...