传送门:http://poj.org/problem?id=3628

题目看了老半天,牛来叠罗汉- -|||和书架什么关系啊。。

大意是:一群牛来叠罗汉,求超过书架的最小高度。

0-1背包的问题,对于第i只牛可以放或者不放。然后最后求出大于书架高度的,减去书架高度即可。

也可以倒着来看。背包的容量为牛总的高度-书架的高度,求不超过这个容量的最大值,最后容量-这个值就是答案了。(推荐)

还可以DFS..

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000000+5;
int H[22],f[MAXN];
int main()
{
int N,B;
while(~scanf("%d%d",&N,&B))
{
memset(f,0,sizeof(f));
int sum=0;
for(int i=1;i<=N;i++)
{
scanf("%d",&H[i]);
sum+=H[i];
} for(int i=1;i<=N;i++)
{
for(int j=sum;j>=H[i];j--)
{
f[j]=max( f[j] , f[j-H[i]]+H[i] );
}
} for(int i=B;i<=sum;i++)
if(f[i]==i)
{
printf("%d\n",f[i]-B);
break;
} }
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000000+5;
int H[22],f[MAXN];
int main()
{
int N,B;
while(~scanf("%d%d",&N,&B))
{
memset(f,0,sizeof(f));
int sum=0;
for(int i=1;i<=N;i++)
{
scanf("%d",&H[i]);
sum+=H[i];
} int contain=sum-B; for(int i=1;i<=N;i++)
{
for(int j=contain;j>=H[i];j--)
{
f[j]=max( f[j] , f[j-H[i]]+H[i] );
}
} printf("%d\n",contain-f[contain]); }
}

DFS:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=9999999;
int H[22];
bool visit[22]={0};
int N,B;
int ans;
void dfs(int cur , int sum)
{
if(sum >=ans)
return; if(cur==N)
{
if(sum>=B)
ans=sum;
return;
} dfs(cur+1,sum);
dfs(cur+1,sum+H[cur]);
}
int main()
{ while(~scanf("%d%d",&N,&B))
{
ans=INF;
for(int i=0;i<N;i++)
scanf("%d",&H[i]); dfs(0,0);
printf("%d\n",ans-B); }
}

POJ 3628 Bookshelf 2 0-1背包的更多相关文章

  1. POJ 3628 Bookshelf 2(01背包)

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9488   Accepted: 4311 Descr ...

  2. POJ 3628 Bookshelf 2【01背包】

    题意:给出n头牛的身高,以及一个书架的高度,问怎样选取牛,使得它们的高的和超过书架的高度最小. 将背包容量转化为所有牛的身高之和,就可以用01背包来做=== #include<iostream& ...

  3. poj 3628 Bookshelf 2 基本01背包

    题目大意:FJ有n头奶牛,和一个高为h的架子,给出每头奶牛高度,求使奶牛叠加起来超过架子的最低高度是多少. 题目思路:求出奶牛叠加能达到的所有高度,并用dp[]保存,最后进行遍历,找出与h差最小的dp ...

  4. POJ 3628 Bookshelf 2 (01背包)

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7496   Accepted: 3451 Descr ...

  5. POJ 3628 Bookshelf 2【背包型DFS/选or不选】

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11105   Accepted: 4928 Desc ...

  6. poj 3628 Bookshelf 2

    http://poj.org/problem?id=3628 01背包 #include <cstdio> #include <iostream> #include <c ...

  7. POJ 3628 Bookshelf 2 题解

    本题解法非常多,由于给出的数据特殊性故此能够使用DFS和BFS,也能够使用01背包DP思想来解. 由于一般大家都使用DFS,这里使用非常少人使用的BFS.缺点是比DFS更加耗内存,只是长处是速度比DF ...

  8. poj 1837 Balance (0 1 背包)

    Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10326   Accepted: 6393 题意:给你n个挂 ...

  9. POJ 1636 Prison rearrangement DFS+0/1背包

    题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS   Memor ...

随机推荐

  1. ZJOI2017线段树

    ZJOI2017线段树 题意: ​ 给你一颗广义线段树,太长了,自己去看. 题解: ​ 直接上zkw那一套,把闭区间换成开区间,就是把取\([l,r]\),变成取\([l-1,l-1],[r+1,r+ ...

  2. 一个简易版的Angular js 三层 示例

    var myApp = angular.module('produceline', []); myApp.factory('ajax', ["$http", "$q&qu ...

  3. ArcGIS “Error HRESULT E_FAIL has been returned from a call to a COM component.” 异常的解决

    错误提示内容: {System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been ret ...

  4. Android开发之经常使用开源库直接拿来用

    1.from  代码家 整理比較好的源代码连接 **************************************************************************** ...

  5. 各种join一目了然: join 、inner join、left join 、right join、full join

    各种join一幅图一目了然 一下每幅图都是指: A * join B on A.id = B.in 这个帖子也非常形象.比較好:http://www.phpddt.com/db/inner_join- ...

  6. php 函数 pathinfo() 在分析文件名时,会含有上级目录

    php 函数 pathinfo() 在分析文件名时,会含有上级目录对一些含有中文的多级目录,这个函数取得的文件名可能会包含上级目录,

  7. 数组&对象

    一.遍历数组的几种方式   var arr = [1,2,3]; Array.prototype.test=function(){} arr.name='jq'   1. for  /* * inde ...

  8. x64系统下,InpOutx64有数字签名而WinIO3.0无数字签名

    参考文档 http://www.highrez.co.uk/Downloads/InpOut32/ //可以下载InpOutx64的驱动程序及DLL,还有驱动主板硬件IO的例程 https://www ...

  9. 【2017 Multi-University Training Contest - Team 6】Inversion

    [链接]h在这里写链接 [题意] 给出一个序列,求2~n每一个数,下标不是这个数倍数的最大值是什么? [题解] 把a数组从大到小排序. 每个位置i,逆序枚举b数组,找到第一个对应下标不是i的倍数的,直 ...

  10. C/C++函数指针声明

    前天看APUE,看到signal的声明竟然是 void (*signal(int,void(*)(int)))(int); 初看下面,还真是看不出这是啥意思.道行太浅,仅仅能看到这样的函数指针 voi ...