poj3628-Bookshelf 2

。。。

。。。

。。。。。。。。。。。。

不得不说,为了看懂这道题,我的想象力遭到了极大的挑战。。。

大概翻译下吧:

貌似是说有个蛋疼的农夫,要把他的牛摆到书架上(这是干毛!想象ing。。。),但是书架已经满了,只能把牛放到书架的顶上。。。

每头牛高度不一样,不过每头牛高度都在1 到 1,000,000之间(尼玛,啥牛啊!

而书架的高度一定 不会 比所有牛高度加起来更高,但也不会小于1

现在,为了让牛能爬到书架顶层上(估计他自己都上不去了),这213农夫可以让所有牛叠罗汉,只要所有牛叠起来可以够到书架顶,估计就可以一个扯着一个上去了(此处想象这蛋疼的画面。。。

但是有一点就是如果最上面那头牛高过书架太高就会有危险(想象一头上万米高的牛在空中摇摇欲坠。。。

所以还要让牛堆的高度与书架的高度差尽量小。。。


所以,这可以大致看成个有特殊要求的01背包解决,

我的解决方法是按01背包列表,不过表的范围需要扩大,因为本题求的不是“尽量装满背包”,而是要“超出背包容量”,超出的大小就按一头牛的最大高度就可以

这样一来,表格完成之后,应该是从左到右非递减序列,这样只要从左到右找,找到第一个比书架高度B大的数就可以了~~


烂代码备份:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long int a[2000005];
int main()
{
	long int n,m,w;
	cin>>n>>m;
	memset(a,0,sizeof(a));
	while(n--)
	{
		cin>>w;
		for(int j=m+1000001;j-w>=0;--j)
			a[j]=a[j]>a[j-w]+w?a[j]:a[j-w]+w;
	}
	for(int i=0;i<=m+1000001;++i)
		if(a[i]>=m)
		{
			printf("%d\n",a[i]-m);
			break;
		}
	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值