POJ 3628 Bookshelf 2

来源:互联网 发布:上瘾网络剧类似的 编辑:程序博客网 时间:2024/06/08 08:34

Description

Time Limit: 1000MS
Memory Limit: 65536K

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

解题思路

题意:有一个书架,书架很高。有一些牛,现在要把牛摞在一起使其总高度不低于书架的高度,求满足条件的这一摞牛的高度与书架的高度的差值。

这题是一道0-1背包,物品的重量和价值都等于牛的高度,背包的容量是物品的总价值。

物品的价值可以认为等于牛的高度,而物品的重量实际上也等于牛的高度,因为在这道题中背包的容量正是牛总高度。

不需要因为题中提到的“一摞牛的高度不低于书架的高度”而改变算法,只需要把书架高度当做背包容量来做,下一个高于书架高度的牛的高度一定是与这个书架高度差之最小的高度。

代码

#include <cstdio>#define N_MAX 25#define W_MAX 9000000using namespace std;int N, threshold, sum = 0;int C[W_MAX]; // C[w]表示物品装入容量为w的背包时总价值的最大值int value[N_MAX];int main() {    scanf("%d%d", &N, &threshold);    sum = 0;    for (int i = 1; i <= N; i++) {        scanf("%d", &value[i]);        sum += value[i];    }    for (int i = 1; i <= N; i++)        for (int j = sum; j >= value[i]; --j)            if (C[j] < C[j - value[i]] + value[i])                C[j] = C[j - value[i]] + value[i];    int w;    for (w = 1; C[w] < threshold; ++w);    printf("%d\n", C[w] - threshold);}
原创粉丝点击