【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)

题干:

Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly, and now the only available space is at the top.

FJ has N cows (1 ≤ N ≤ 20) each with some height of Hi (1 ≤ Hi ≤ 1,000,000 - these are very tall cows). The bookshelf has a height of B (1 ≤ B ≤ S, where S is the sum of the heights of all cows).

To reach the top of the bookshelf, one or more of the cows can stand on top of each other in a stack, so that their total height is the sum of each of their individual heights. This total height must be no less than the height of the bookshelf in order for the cows to reach the top.

Since a taller stack of cows than necessary can be dangerous, your job is to find the set of cows that produces a stack of the smallest height possible such that the stack can reach the bookshelf. Your program should print the minimal 'excess' height between the optimal stack of cows and the bookshelf.

Input

* Line 1: Two space-separated integers: N and B
* Lines 2..N+1: Line i+1 contains a single integer: Hi

Output

* Line 1: A single integer representing the (non-negative) difference between the total height of the optimal set of cows and the height of the shelf.

Sample Input

5 16
3
1
3
5
6

Sample Output

1

题目大意:

    其实很简单啦就是给你n个高度,让你挑其中的几个摞起来。要求摞起来以后的总高度超过b,问你这样的高度的最小值是多少。(让你输出  最小值 - b )

有n头牛,已知每头牛的高度和书架高度,一头牛可以站在另一头牛身上,总高度是他们的高度之和。要求能够达到书架的顶端,即这些牛的总高度不低于书架高度,求满足条件的总高度的最小值,输出他们的差值。

解题报告:

    这题高度小于100W(1e6),但是题目说b要小于总高度和,n<=20,也就是说b<=2000W(2e7),这个数字其实做0-1背包就已经很牵强了(我也试过了开了2e7的数组然后MLE了),不过还好这题数据量没给到这么大,开个100W的数组就过去了。不过要说到正解,这题是搜索啊!n<=20这么小的数据量你不去dfs吗?!

下面附四个代码:

AC代码1:(自己写  装满类型0-1背包)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;
const int MAX = 1000000 +5;
const int INF = 0x3f3f3f3f;
int dp[MAX];
int v[50];bool cmp(const int a,const int b) {return a>b;
}
int main()
{int n,b;cin>>n>>b;for(int i = 1; i<=n; i++) {cin>>v[i];}sort(v+1,v+n+1,cmp);//cout <<"kaishile"<<endl;memset(dp,INF,sizeof(dp));dp[0] = 0;for(int i = 1; i<=n; i++) {for(int j = b + v[1]; j>=v[i]; j-- ) {dp[j] = min(dp[j],dp[j -v[i] ] + 1);}}int ans = -1;for(int i = b; i<=b+v[1]; i++) {if(dp[i] !=INF) {ans = i - b; break;}}cout << ans<<endl;return 0 ;
}

AC代码2:(网络版的 装满类型0-1背包) 

#include<cstdio>
using namespace std;
const int mm=20000000;
bool f[mm];
int h[22];
int i,j,k,n,b,m;
int main()
{while(scanf("%d%d",&n,&b)!=-1){for(m=i=0;i<n;++i)scanf("%d",&h[i]),m+=h[i];for(i=0;i<=m;++i)f[i]=0;f[0]=1;for(i=0;i<n;++i)for(j=m-h[i];j>=0;--j)if(f[j])f[j+h[i]]=1;for(i=b;i<=m;++i)if(f[i])break;printf("%d\n",i-b);}return 0;
}

上面这个代码看起来0-1背包不太一样,其实是一样的。只不过一般j从m开始递减,这里是从m-h[i]开始的,其实是一样的。

之所以要把这个代码贴上来其实主要不是这个地方,而是他只用了bool类型的dp数组,因为这里只需要记录这个高度是否可以到达,而不需要知道具体能到达的高度是多少。其实往深里讲,这是因为这个题只有h[i] 这一个权值,而不是标准的0-1背包还需要w和v两个权值,所以其实就算是按照我上面自己写的代码那样写,其实每个dp数组中只要不是-INF,那么这个值一定就是高度一定就是i(也就是dp[i]一定等于i),所以其实这两种写法是等价的。

AC代码3:(纯裸的0-1背包)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[2000002], h[22];
int main()
{int n, m, i, j;while(~scanf("%d%d",&n,&m)){int sum = 0;memset(dp,0,sizeof(dp));for(i = 1; i <= n; i++){scanf("%d",&h[i]);sum += h[i];}for(i = 1; i <= n; i++)for(j = sum; j >= h[i]; j--)dp[j] = max(dp[j], dp[j - h[i]] + h[i]);int Min = sum;for(i = m; i <= sum; i++)if(dp[i] >= m && dp[i] - m < Min)Min = dp[i] - m;printf("%d\n",Min);}return 0;
}

AC代码4:(网络版 dfs)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int h[22], ans, flag;
int n, m;
void dfs(int k, int s)
{if(s == m){ans = 0;return ;}if(s >= m){if(s - m < ans)ans = s - m;return ;}for(int i = k; i < n; i++){dfs(i+1,s+h[i]);}
}
int main()
{int i;while(cin >> n >> m){int sum = 0;flag = 0;for(i = 0; i < n; i++){cin >> h[i];sum += h[i];}if(sum == m){cout << "0" << endl;continue;}ans = sum;dfs(0,0);cout << ans << endl;}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES5总结1:数组Array新特性最全最精简的详解

2个位置方法&#xff1a;indexOf lastIndexOf 5个迭代方法&#xff1a;forEach every some filter map 2个高阶函数&#xff1a;reduce reduceRight &#xff08;可用于数组求和&#xff09; API: 1、indexOf(searchElement: T, fromIndex?: n…

Apollo自动驾驶入门课程第③讲 — 定位

目录 1. 定位的概述 2. 定位方法介绍 2.1 GNSS RTK 2.2 惯性导航 2.3 激光雷达定位 2.4 视觉定位 2.5 Apollo定位 本文转自微信公众号&#xff1a;Apollo开发者社区 原创&#xff1a; 阿波君 Apollo开发者社区 8月17日 上周我们发布了 Apollo入门课堂第②讲—高精地图&…

【HRBUST - 1621】迷宫问题II (bfs)

题干&#xff1a; 小z身处在一个迷宫中&#xff0c;小z每分钟可以走到上下左右四个方向的相邻格之一。迷宫中有一些墙和障碍物。 同时迷宫中也有一些怪兽&#xff0c;当小z碰到任意一个怪兽时&#xff0c;小z需要将怪兽消灭掉才可以离开此方格。但消灭 怪兽会花费一定的时间。…

Linux与Bash 编程——Linux文件处理命令-L1

目录&#xff1a; linux系统与shell环境准备 Linux系统简介操作系统简史Linux的发行版&#xff1a;Linux与Windows比较&#xff1a;Linux安装安装包下载Linux的访问方式远程登录方式远程登录软件&#xff1a;mobaxterm的使用&#xff1a;使用电脑命令行连接&#xff1a;sshd的…

4.Transfer Learning

Intro 这是深度学习第4课。 在本课程结束时&#xff0c;您将能够使用迁移学习为您的自定义目标构建高度准确的计算机视觉模型&#xff0c;即使您的数据相对较少。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(mPFq5KMxKVw, width800, height450) S…

Angular相关的有价值的问题集锦

001. Angular的三大核心概念是什么&#xff1f; 答&#xff1a;组件化、模块化和路由&#xff08;Component、NgModule、Router&#xff09;,其中最核心的概念是组件化Component。 002. 前端为什么需要Router&#xff1f; 答&#xff1a;如果没有Router&#xff0c;浏览器的…

如何在Word中排版出漂亮规整的编程语言代码样式?【☆】

[1] 能输出各种编程语言并保持代码格式和语法高亮显示的网站&#xff1a; PlanetB | Syntax Highlight Code in Word Documents http://www.planetb.ca/syntax-highlight-word Welcome! — Pygments http://pygments.org/ [2] How do you display code snippets in MS Wor…

网络编程懒人入门(一):快速理解网络通信协议(上篇)

转自即时通讯网&#xff1a;http://www.52im.net/ 原作者&#xff1a;阮一峰(ruanyifeng.com&#xff09;&#xff0c;本文由即时通讯网重新整理发布&#xff0c;感谢原作者的无私分享。 1、写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统&#xff0c;很…

PCA算法中样本方差和协方差的无偏估计与n-1的由来

原文出处&#xff1a; http://blog.sina.com.cn/s/blog_c96053d60101n24f.html 在PCA算法中的方差协方差计算公式中除数为什么是n-1? 假设X为独立同分布的一组随机变量&#xff0c;总体为M&#xff0c;随机抽取N个随机变量构成一个样本&#xff0c;和是总体的均值和方差, 是常…

【Gym - 101915D】Largest Group(二分图最大团,状压dp)

题干&#xff1a; 大黑山上有小小民和小小涛两种物种&#xff0c;山东人小李想要研究这两种物种的关系 奇怪的是大黑山上有相同数量的小小民和小小涛。小李数了数一共有 P 个&#xff0c;小李分别给P个小小民和小小涛编号 1 - P 号&#xff0c;已知每对小小民之间都是好朋友&…

Apollo自动驾驶入门课程第④讲 — 感知(上)

目录 1. 感知的概述 2. 计算机视觉 3. 摄像头图像 4. LiDAR图像 5. 机器学习 6. 神经网络 7. 反向滤波法 本文转自微信公众号&#xff1a;Apollo开发者社区 原创&#xff1a; 阿波君 Apollo开发者社区 8月23日 上一篇文章中&#xff0c;我们发布了无人驾驶技术的 定位篇…

三种经典的洗牌算法

参考原文链接&#xff1a;https://blog.csdn.net/qq_25026989/article/details/89512769 问题描述&#xff1a;洗牌算法是将原来的数组进行打散&#xff0c;使原数组的某个数在打散后的数组中的每个位置上等概率的出现。 主要有3中经典的洗牌算法&#xff1a; 1.抽牌&#x…

【数据库实验课堂】实验一:数据库的管理

实验一&#xff1a;数据库的管理 1、假设SQL Server服务已启动&#xff0c;并以Administrator身份登录计算机&#xff08;文件名称自定&#xff09;&#xff1b;请分别使用Management界面方式和T-SQL语句实现以下操作&#xff1a; 1) 要求在本地磁盘D创建一个学生-课程数据库…

网络编程懒人入门(二):快速理解网络通信协议(下篇)

转自即时通讯网&#xff1a;http://www.52im.net/ 原作者&#xff1a;阮一峰(ruanyifeng.com&#xff09;&#xff0c;本文由即时通讯网重新整理发布&#xff0c;感谢原作者的无私分享。 1、前言 本文上篇《网络编程懒人入门(一)&#xff1a;快速理解网络通信协议&#xff0…

为什么说逻辑回归LR是线性分类器?

问题描述&#xff1a;为什么说逻辑回归LR是非常典型的线性分类器&#xff1f; 首先&#xff0c;我们要弄明白区分线性与非线性分类器的标准是什么&#xff1f;是决策边界&#xff08;Decision Boundary&#xff09; 以二分类&#xff08;LR可以用于多分类&#xff09;为例进行…

【数据库实验课堂】实验二 使用SQL Server管理数据表

实验二 使用SQL Server管理数据表&#xff1a; 1、请在指定数据库内完成以下内容&#xff1a; 1) 依据数据表的结构创建相对应的数据表&#xff0c;表结构如下所示&#xff1b; **学生信息表&#xff08;student&#xff09;**字段名称 字段类型及长度 说明 备注 S…

5, Data Augmentation

Intro 这是深度学习第5课 在本课程结束时&#xff0c;您将能够使用数据增强。 这个技巧让你看起来拥有的数据远远超过实际拥有的数据&#xff0c;从而产生更好的模型。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(ypt_BAotCLo, width800, height45…

朴素贝叶斯算法注意事项(有待完善)

1.朴素贝叶斯算法的优缺点总结&#xff1a; 优点&#xff1a; 朴素贝叶斯模型发源于古典数学理论&#xff0c;有稳定的分类效率&#xff1b;分类速度快&#xff0c;准确度高&#xff1b;对缺失数据不太敏感&#xff0c;算法简单&#xff0c;常用于文本分类&#xff08;如新闻…

网络编程懒人入门(三):快速理解TCP协议一篇就够

转自即时通讯网&#xff1a;http://www.52im.net/ 原作者&#xff1a;阮一峰(ruanyifeng.com&#xff09;&#xff0c;本文由即时通讯网重新整理发布&#xff0c;感谢原作者的无私分享。 1、前言 本系列文章的前两篇《网络编程懒人入门(一)&#xff1a;快速理解网络通信协议…

【数据库实验课堂】实验三:管理SQL Server表数据

以课本指定的数据库为例&#xff0c;并依据数据表的结构创建相对应的数据表&#xff08;student、course、sc&#xff09;&#xff0c;请分别使用Management Stuio界面方式及T-SQL 语句实现进行以下操作&#xff1a; 向各个数据表中插入如下记录&#xff1a; 学生信息表&#…