POJ 3628 Bookshelf 2 0-1背包
传送门: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背包的更多相关文章
- POJ 3628 Bookshelf 2(01背包)
Bookshelf 2 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9488 Accepted: 4311 Descr ...
- POJ 3628 Bookshelf 2【01背包】
题意:给出n头牛的身高,以及一个书架的高度,问怎样选取牛,使得它们的高的和超过书架的高度最小. 将背包容量转化为所有牛的身高之和,就可以用01背包来做=== #include<iostream& ...
- poj 3628 Bookshelf 2 基本01背包
题目大意:FJ有n头奶牛,和一个高为h的架子,给出每头奶牛高度,求使奶牛叠加起来超过架子的最低高度是多少. 题目思路:求出奶牛叠加能达到的所有高度,并用dp[]保存,最后进行遍历,找出与h差最小的dp ...
- POJ 3628 Bookshelf 2 (01背包)
Bookshelf 2 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7496 Accepted: 3451 Descr ...
- POJ 3628 Bookshelf 2【背包型DFS/选or不选】
Bookshelf 2 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11105 Accepted: 4928 Desc ...
- poj 3628 Bookshelf 2
http://poj.org/problem?id=3628 01背包 #include <cstdio> #include <iostream> #include <c ...
- POJ 3628 Bookshelf 2 题解
本题解法非常多,由于给出的数据特殊性故此能够使用DFS和BFS,也能够使用01背包DP思想来解. 由于一般大家都使用DFS,这里使用非常少人使用的BFS.缺点是比DFS更加耗内存,只是长处是速度比DF ...
- poj 1837 Balance (0 1 背包)
Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10326 Accepted: 6393 题意:给你n个挂 ...
- POJ 1636 Prison rearrangement DFS+0/1背包
题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS Memor ...
随机推荐
- html页面中块级元素的居中
第一:在页面中使用 margin: 0 auto;居中: <div> <p>夜屋</p> </div> div { width: 100%; posit ...
- 6lession-基本数据类型
因为自己是根据网上教程学习的,所以以下内容参考自 http://www.w3cschool.cc/python/python-variable-types.html python支持物种数据类型,分别 ...
- c++运算符重载笔记
运算符重载的概念:给原有的运算符赋予新的功能: 比如:+ 不仅可以做算术运算也可以连接俩个字符串 一元运算符:只与一个操作数进行运算 比如 正负号 运算符重载的本质是:函数重载. <<与& ...
- 洛谷P3273 [SCOI2011]棘手的操作
题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作:U x y: 加一条边,连接第x个节点和第y个节点A1 x v: 将第x个节点的权 ...
- POJ 1113 Wall 求凸包
http://poj.org/problem?id=1113 不多说...凸包网上解法很多,这个是用graham的极角排序,也就是算导上的那个解法 其实其他方法随便乱搞都行...我只是测一下模板... ...
- BZOJ2733: [HNOI2012]永无乡(线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌)
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- 内核中的宏定义__init、__initdata和__exit、__exitdata
__init.__initdata和__exit.__exitdata的定义位于<kernel/include/linux/init.h> /* These are for everybo ...
- POJ——T2271 Guardian of Decency
http://poj.org/problem?id=2771 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5932 A ...
- android开发者要懂得问题答案
我在网上看了一下有些人在博客上提出一些什么android开发者必须懂得问题,可是就是没有答案,所以我就把这些问题拷贝过来了.顺便也把全部的答案加上,为了让很多其它的开发者高速的找到答案,谢谢! 以下的 ...