void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一些牛的高度,问你把牛叠加起来的高度,超过所给的牛棚高度,并且超出的高度最小是多少

直接用背包把能达到高度的牛的高度最小值保存起来,然后求解

View Code
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4 #include <string.h>
5 #include <algorithm>
6 #include <limits.h>
7  using namespace std;
8  int w[1000002],bag[20000005];
9  int main(void)
10 {
11 int n,c;
12 while( scanf("%d %d",&n,&c)!=EOF )
13 {
14 int sum = 0;
15 for(int i=1; i<=n; i++)
16 {
17 scanf("%d",&w[i]);
18 sum += w[i];
19 }
20 for(int i=1; i<=c; i++)
21 bag[i] = 0;
22 for(int i=1; i<=n; i++)
23 for(int k=sum; k>=w[i]; k--)
24 {
25 if( bag[k] < bag[k-w[i]] + w[i] )
26 bag[k] = bag[k-w[i]] + w[i];
27 }
28 int min = INT_MAX;
29 for(int i=c; i<=sum; i++)
30 {
31 if( bag[i] >= c && bag[i] - c < min )
32 min = bag[i] - c;
33 }
34 cout << min << endl;
35 }
36 return 0;
37 }
posted on 2011-05-07 16:04  void-man  阅读(284)  评论(0)    收藏  举报