题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3177

\(describe\):

有一个山洞,山洞的容积最大为\(v\)。现在你有\(n\)个物品,这些物品在往山洞里搬和放在山洞所需要占用山洞的体积是两个不同的值\(B\),\(A\)。你可以理解为在搬运这个物品进洞时需要的容积为一个\(B\),放下物品后的容积是一个\(A\)。在任何时刻搬运物品都不允许超过山洞的最大容积。试求能不能把所有物品搬进去

题解:

这个题正解是贪心...没错...

题目只问的是能不能都放完,我们贪心地往里放物品看看能不能放完就好了。

证明:

~~zhx的证明法: ~~
——贪心题都是排序题。
设只有两个物品a,b
要么先放a,要么先放b,反正两种放法
考虑若先放a的话 当前v要 > a.B 放了a.A
然后放b 放了b.B 结果 a.A+b.B 复读:
考虑若先放b的话 当前v要 > b.B 放了b.A
然后放a 放了a.B 结果 b.A+a.B 比较两个结果取min就ok了啊
操作?
如果排序a,b
放的顺序是a,b
那么就会是a.A+b.B < b.A+a.B
你把这俩反着证明也一样,自己明白咋排序就行,实在不行排上几种序什么a.A+a.B<b.A+b.B a.A-a.B<b.A-b.B......取个min
看心情化简:a.A-a.B < b.A-b.B

code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e7;
int n, v, ans, T;
struct thing{
int B, A;
}e[maxn];
bool cmp(thing a, thing b)
{
return a.A + b.B < b.A + a.B;
}
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--)
{
ans = 0;
cin>>v>>n;
for(int i = 1; i <= n; i++)
cin>>e[i].A>>e[i].B;
sort(e+1, e+1+n, cmp);
for(int i = 1; i <= n; i++)
if(e[i].B <= v)
{
ans++;
v -= e[i].A;
}
if(ans == n) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}

考虑变式一下:

如果是求最多能放多少物品呢?

那就是DP了。

如果能放完的话,第一个是一定会放进去的,所以用贪心判断能不能放完是可以的,但是如果求最多放进去数量的话,我们第一个选不选是不确定的,所以需要跑一个01背包。

但是..DP?需要无后效性的。

那么最优的序列,就是我们贪心排序过后的序列。

好了,在这个序列上跑一个背包。

但是我们在进行状态转移的时候,需要控制一下。

设\(dp[j]\) 表示已经放满\(j\)容积时的能放下的最多的物品数

那么转移方程就是\(dp[j] = max(dp[j], dp[j-a[i].A]+1)\)

转移要满足一开始能搬进这个东西来,所以又有:

\(if(v - (j - a[i].A) >= a[i].B)\)

j是当前使用的容积(包含着搬进后的物品容积,所以j-a[i].A),再用v减去,就是剩下的。

于是:

code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000;
int dp[maxn], n, v, ans;
struct thing{
int A, B;
}a[maxn];
bool cmp(thing a, thing b)
{
return a.A - a.B < b.A - b.B;
}
int main()
{
cin>>n>>v;
for(int i = 1; i <= n; i++) cin>>a[i].B>>a[i].A;
sort(a+1, a+1+n, cmp);
for(int i = 1; i <= n; i++)
{
for(int j = v; j >= a[i].A; j--)
{
if(v - (j - a[i].A) >= a[i].B)
dp[j] = max(dp[j-a[i].A] + 1, dp[j]);
ans = max(dp[j], ans);
}
}
cout<<ans;
return 0;
}

//MisakaAzusa

//dsbdsb

【hdu 3177 Crixalis's Equipment】 题解的更多相关文章

  1. Hdu 3177 Crixalis's Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 3177 Crixalis's Equipment (贪心,差值)

    题意:判断 n 件物品是否可以搬进洞里,每件物品有实际体积A和移动时的额外体积 B . 析:第一反应就是贪心,一想是不是按B从大到小,然后一想,不对,比如体积是20,第一个 是A=11, B=19.第 ...

  3. HDU ACM 3177 Crixalis's Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. hdu 3177 Crixalis&#39;s Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. HDU 3177 Crixalis&#39;s Equipment(贪婪)

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=3177 Problem Description Crixalis - Sand King used t ...

  6. 杭电 3177 Crixalis&#39;s Equipment

    http://acm.hdu.edu.cn/showproblem.php? pid=3177 Crixalis's Equipment Time Limit: 2000/1000 MS (Java/ ...

  7. HDOJ 3177 Crixalis&#39;s Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. hdu---3177 Crixalis's Equipment 根据 两个元素 之间的权衡进行排序

    Crixalis's Equipment Problem Description Crixalis - Sand King used to be a giant scorpion(蝎子) in the ...

  9. HDU 2157 How many ways?? 题解

    题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...

随机推荐

  1. maven 程序包com.sun.image.codec.jpeg

    在 Pom.xml 增加 <build> <plugins> <plugin> <artifactId>maven-compiler-plugin< ...

  2. 第N次学习javaIO之后

    io按流分 输入流.输出流 io按类型分(是类型吧) 字节流.字符流 ------------------------------------- 先说说一直以来混淆什么时候用输入流,什么时候用输出流. ...

  3. 基于SSH框架下登录验证码模块的实现

    1.前端页面代码: 主要以jQuery的ajax异步请求实现. ... <script type="text/javascript" src="${pageCont ...

  4. 13 Reasons Why You Should Pay Attention to Mobile Web Performance

    Mobile is no longer on the sidelines. If you’re not already thinking mobile first, you should at lea ...

  5. com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现"$ref":"$[0]"现象问题

    1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]" ...

  6. 【js常用DOM方法】

    介绍几个js DOM的常用方法 获取元素节点 getElementById  getElementsByTagName  getElementsByClassName 先写一个简单的网页做测试: /* ...

  7. Java 之集合框架 上(9)

    Java 中的集合框架 如果一个类中存在很多相同类型的属性. 例如:学生类 学生可以选课,因此存在很多课程类型的属性.但是每个学生选择的课程的种类和数量是不一样的. 如果将每一个课程类型的属性都列到课 ...

  8. django从1.7升级到1.9后 提示:RemovedInDjango110Warning

    Django项目,把django从1.7升级到1.9后,大量报错.需要做如下修改. 1,修改urls.py: 在django1.9里,urls的配置不再支持字符串型的路由.需要先import,然后直接 ...

  9. 如何查看服务器CPU核心数和线程数

    知道服务器CPU型号,那么我们如何在服务器里面查看服务器CPU核心数和线程数呢? 步骤: 先用鼠标右键点击屏幕最下方的任务栏空白处.会弹出一个菜单. 在菜单中用鼠标左键点选“启动任务管理器”. 点击任 ...

  10. Django 代码初体验

    其实Django中的代码逻辑就是和我们以前所学的一些项目差不多 就是 解耦.解耦.解耦 创建过后的Django文件 其中的day68是你的 项目的名字的相同的一个自动生成的文件里面都是放置配置文件类似 ...