您的位置:首页 > 其它

ACM: 动态规划题 poj&nb…

2016-05-19 23:25 399 查看
[align=center]Bookshelf 2[/align]
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 ≤ BS, 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个数, 要求出它们之中一部的和sum, 求出sum-S最小值.

 

解题思路:

     
1. 简单背包.

 

代码:

#include <cstdio>

#include <iostream>

#include <cstring>

using namespace std;

#define MAX 2000005

#define MAXSIZE 25

int n, S;

int dp[MAX];

int cost[MAXSIZE], sum;

inline int max(int a, int b)

{

 return a > b ? a : b;

}

void DP()

{

 for(int i = 1; i <= n; ++i)

 {

  for(int j = sum; j
>= cost[i]; --j)

  {

   dp[j] =
max(dp[j], dp[ j-cost[i] ]+cost[i]);

  }

 }

}

int main()

{

 int i;

// freopen("input.txt", "r", stdin);

 while(scanf("%d %d", &n,
&S) != EOF)

 {

  sum = 0;

  for(i = 1; i <=
n; ++i)

  {

   scanf("%d",
&cost[i]);

   sum +=
cost[i];

  }

  memset(dp, 0,
sizeof(dp));

  DP();

  for(i = S; i
<= sum; ++i)

  {

   if( i ==
dp[i] )

   {

    printf("%d\n",
i-S);

    break;

   }

  }

 }

 return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: