题目链接:Bookshelf 2(点击进入)

题目解读:

给n头牛,给出每个牛的高度h[i],给出一个书架的高度b(所有牛的高度相加>书架高度b),现在把一些牛叠起来(每头牛只能用一次,但不同的牛可能身高相同),在这些叠起来的牛的总高度>书架b的基础上,找出最小的差距(由于输入的数据会保证所有牛的高度相加>书架高度b,所以差距不为负)

还是看不懂题目?

举个栗子:

现在有五头牛高度分别为3 1 3 5 6,书架高度b=16,我们可以把五头牛都叠起来,总高度为18,差距为18-16=2,但这样差距不是最小的,最小的差距是:(3+3+5+6)-16=1

这题可以看成01背包是每个牛只能选一次或者不选,然后我们可以先忽略书架高度b,对于单个牛高度h[i],我们可以看成 价值[i]=占用空间[i]=h[i],因为牛的占用空间就是高度也就是他的价值,毕竟最后需要总高度>b,那这不就是总价值>b

我在写的时候卡在如何处理最小差距,原来最后是这样的:如果我们按平常01去运算,最后会得到一个f[]数组里面塞满了数据,并且从左到右是不降低的,f[j]的意义就是容量为j时的最大总高度,那么j是从1~sum(所有牛高度和)的,比如说书架高度为b=15,当f[j]的值<b,那么如果f[j+1]的值>=b了,则f[j+1]-b就是我们要的高度,因为f[j]到f[j+1]的空间最大容量只加了1,而牛的高度最起码>=1吧

这题在普通的01背包基础上,还在最后加入了选择数据的过程

因为数组f[]从左到右是恒不降低的,那么直接从左到右找出第一个>=b的f[j]就是最小差距了

下面的代码涉及滚动数组与01背包空间优化,如果不了解建议先看我的另一篇:对01背包的分析与理解(图文)

下面上代码

#include<cstdio>
#include<iostream>
#include<string.h>
#define ll long long
using namespace std;
ll h[];//存放每个牛的高度
int main()
{
ll n,b,sum=;
cin>>n>>b;
for(ll i=;i<=n;i++)
{
scanf("%lld",&h[i]);
sum+=h[i];//sum为所有奶牛高度和
}
ll f[sum+];
memset(f,,sizeof(f));//清空数组
for(ll i=;i<=n;i++)
for(ll j=sum;j>=h[i];j--)
{
f[j]=max(f[j],f[j-h[i]]+h[i]);//看作价值=占用空间=高度
}
for(ll i=;i<=sum;i++)
if(f[i]>=b)//如果差距>=0
{
cout<<f[i]-b<<endl;
return ;
} }

点击加号查看代码

Bookshelf 2(poj3628,01背包,dp递推)的更多相关文章

  1. D. Caesar's Legions 背包Dp 递推DP

    http://codeforces.com/problemset/problem/118/D 设dp[i][j][k1][k2] 表示,放了i个1,放了j个2,而且1的连续个数是k1,2的连续个数是k ...

  2. POJ 2229 sumset ( 完全背包 || 规律递推DP )

    题意 : 给出一个数 n ,问如果使用 2 的幂的和来组成这个数 n 有多少种不同的方案? 分析 :  完全背包解法 将问题抽象==>有重量分别为 2^0.2^1.2^2…2^k 的物品且每种物 ...

  3. noj [1479] How many (01背包||DP||DFS)

    http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...

  4. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  5. hdu2089(数位DP 递推形式)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. POJ3628:Bookshelf 2【01背包】

    Description Farmer John recently bought another bookshelf for the cow library, but the shelf is gett ...

  7. BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]

    数    位    D    P    开    long    long 首先第一问是转化. 于是就可以二进制下DP了. 第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括 ...

  8. 12563 - Jin Ge Jin Qu hao——[DP递推]

    (If you smiled when you see the title, this problem is for you ^_^) For those who don’t know KTV, se ...

  9. hdu 2604 Queuing(dp递推)

    昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...

随机推荐

  1. 最大heap

    1 什么是最大heap 最大heap是一棵完全二叉树.每棵子树的根比它的两棵子树上的节点都要大. 2 建堆的过程 function max_heaptify(A): for (i = n/2向下取整: ...

  2. centos7 tengine2.1.2 编译安装 防火墙设置

    安装 pcre 和 openssl yum -y install pcre pcre-devel yum -y install openssl openssl-devel wget http://te ...

  3. URAL1553 Caves and Tunnels 树链剖分 动态树

    URAL1553 维护一棵树,随时修改某个节点的权值,询问(x,y)路径上权值最大的点. 树是静态的,不过套动态树也能过,时限卡的严就得上树链剖分了. 还是那句话 splay的核心是splay(x) ...

  4. C#面向过程之类型转换、算术运算符、关系运算符、逻辑运算符、if-else语句、switch-case、循环结构(while、for)、三元表达式

    数据类型转换: int.parse()只能转换string类型的 当参数为null时会报异常int i =Convert.ToInt32(false) 运行结果是0int i =Convert.ToI ...

  5. vue 加载文件,省略后缀后的加载顺序

    Vue使用import ... from ...来导入组件,库,变量等.而from后的来源可以是js,vue,json.这个是在webpack.base.conf.js中设置的: module.exp ...

  6. codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】

    直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...

  7. (DP)51NOD 1085 背包问题

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...

  8. Shape Drawable Resources

    1,示例 它们的代码如下: shape_oval.xml <?xml version="1.0" encoding="utf-8"?> <sh ...

  9. 405 Convert a Number to Hexadecimal 数字转换为十六进制数

    给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法.注意:    十六进制中所有字母(a-f)都必须是小写.    十六进制字符串中不能包含多余的前导零.如果 ...

  10. eclipse安装提示错误:Failed to load JNI shared library "D:\jdk1.7\client\jvm.dll"

    错误截图如下 原因是jdk32位,eclipse64位导致,修改jdk版本为64位或者修改ecipse版本为32位即可.