ACM: 动态规划题 poj&nb…

来源:互联网 发布:win7如何安装linux系统 编辑:程序博客网 时间:2024/06/05 16:34
Bookshelf 2

Description

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

FJ has N cows (1 ≤ N ≤ 20) each with some heightof 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 heightsof all cows).

To reach the top of the bookshelf, one or more of the cows canstand on top of each other in a stack, so that their total heightis the sum of each of their individual heights. This total heightmust be no less than the height of the bookshelf in order for thecows 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 thesmallest height possible such that the stack can reach thebookshelf. Your program should print the minimal 'excess' heightbetween the optimal stack of cows and the bookshelf.

Input

* Line 1: Two space-separated integers: N andB
* 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 andthe 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;
}

 

0 0
原创粉丝点击