博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3628 Bookshelf 2(01背包)
阅读量:5238 次
发布时间:2019-06-14

本文共 2302 字,大约阅读时间需要 7 分钟。

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

Description

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 1631356

Sample Output

1

Source

 

 

一种做法是用dp[i]代表不超过i的可堆到最大程度,然后从m开始寻找第一个大于等于m的dp[i]就是答案,我用的是恰好装满的初始化条件,若可以出现一个恰好装满的解就输出……题目的S小于2000W其实比较大,1000W就差不多了

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define INF 0x3f3f3f3f#define CLR(x,y) memset(x,y,sizeof(x))#define LC(x) (x<<1)#define RC(x) ((x<<1)+1)#define MID(x,y) ((x+y)>>1)typedef pair
pii;typedef long long LL;const double PI=acos(-1.0);const int N=10000010;int dp[N];int cow[30];int n,m;void zero_one_pack(int c,int w,int V){ for (int i=V; i>=c; --i) if(dp[i-c]+w>dp[i]) dp[i]=dp[i-c]+w;}int main(void){ int i,ans; while (~scanf("%d%d",&n,&m)) { CLR(dp,-INF); dp[0]=0; int sum=0; for (i=0; i
=0) { printf("%d\n",i-m); break; } } } return 0;}

转载于:https://www.cnblogs.com/Blackops/p/5784459.html

你可能感兴趣的文章
组建自己的局域网(可以将PC机实现为服务器)
查看>>
jstack的使用:死锁问题实战
查看>>
Ubuntu Sublime Text 设置等宽字体
查看>>
双摆的程序实现
查看>>
Button 控件
查看>>
用游标来查找数据例子:
查看>>
不是第一次的第一篇
查看>>
正则表达式实例
查看>>
ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin
查看>>
数据类型之整型;浮点型;字符串;列表
查看>>
浏览器的get请求和post请求的区别
查看>>
GDI+用PNG图片做半透明异型窗口
查看>>
<神鬼传奇>客户端-终极优化精简方法
查看>>
Group by、having、order by、Distinct 使用注意事项
查看>>
H3C交换机配置远程管理配置
查看>>
一篇文章看懂Java并发和线程安全
查看>>
阿里巴巴电话面试记录(他人的)
查看>>
简明python教程 --C++程序员的视角(八):标准库
查看>>
nginx 网络层的优化
查看>>
HTTP与HTTPS的区别
查看>>