题目链接: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. hdu 1880 魔咒词典 (字符串哈希)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. HDU 2041--超级楼梯(递推求解)

    Description 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?   Input 输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每 ...

  3. KDTree(Bzoj2648: SJY摆棋子)

    题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...

  4. Spring Data MongoDB 模糊查询

    Pattern pattern = Pattern.compile("^.*" + value + ".*$"); Query query = new Quer ...

  5. CentOS6.5(4)----宿主机无法访问虚拟机中的web服务解决方案

    宿主机无法访问虚拟机中的web服务 在Windows7宿主机中的VMware虚拟机中安装了CentOS6.5操作系统,并且基于Nginx搭建了Web服务器,网页刚刚搭建好的时候,通过宿主机的浏览器可以 ...

  6. MySQL数据库(9)----从命令行获取元数据

    1. mysqlshow 命令提供的信息与某些 SHOW 语句很相似,因此可以从命令行提示符获取数据库和表的信息. (i)列出服务器所管理的数据库: root@javis:~$ mysqlshow - ...

  7. Gensim入门教程

    What is Gensim? Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达.它支持包括TF-IDF,LSA,LDA,和word ...

  8. day04之VUE痛悟

    vue组件组件分为三部分

  9. 平均负载(Load average)

    load average 的含义平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. top命令中load average显示的是最近1分钟.5分钟和1 ...

  10. javascript requestAnimationFrame vs. setTimeout

    在做javascript动画时,我们常常使用的方法就是通过setTimeout调用告诉浏览器每隔20ms执行一段js代码来对dom对象执行操作,这个貌似没有什么问题,但是当深入理解计算机的fps以及浏 ...