给出一些牛的高度,问你把牛叠加起来的高度,超过所给的牛棚高度,并且超出的高度最小是多少
直接用背包把能达到高度的牛的高度最小值保存起来,然后求解

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 }