题目链接: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. uva 725 DIVISION (暴力枚举)

    我的56MS #include <cstdio> #include <iostream> #include <string> #include <cstrin ...

  2. BZOJ4162:shlw loves matrix II

    传送门 利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\) 然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\) 然后就多项式快速幂+取模 最 ...

  3. HTML5之新增的元素和废除的元素 (声明:内容节选自《HTML 5从入门到精通》)

    新增结构元素: section元素 section元素定义文档或应用程序中的一个区段,比如章节.页眉.页脚或文档中的其他部分.它可以与h1,h2,h3,h4,h5,h6元素结合起来使用,标示文档结构. ...

  4. 基于 JWT-Auth 实现 API 验证

    基于 JWT-Auth 实现 API 验证 如果想要了解其生成Token的算法原理,请自行查阅相关资料 需要提及的几点: 使用session存在的问题: session和cookie是为了解决http ...

  5. window.addEventListener绑定事件记得删除

    在做postMessage通信时,window.addEventListener绑定的事件记得要remove掉 就和setTime一样,不然占用内存资源

  6. angular排序

    说点小案例angular的排序 <!DOCTYPE html> <html ng-app="mk"> <head> <meta chars ...

  7. jquery 之事件 方法

    一.jquery事件 1 blur()       触发.或将函数绑定到指定元素的 blur 事件 2 change()     触发.或将函数绑定到指定元素的 change 事件 3 click() ...

  8. Monte Calro Tree Search (MCTS)

    https://blog.csdn.net/natsu1211/article/details/50986810, 感谢分享! Intro最近阿法狗和李师师的人机大战着实火了一把,还顺带捧红了柯杰,古 ...

  9. MyBatis学习笔记(一)

    测试Demo的目录结构: com.luohao.config ->MyBatisCongfig.xml ->userMapper.xml com.luohao.Test ->Test ...

  10. Java并发基础(上)——Thread

    并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...