poj 3628_0/1背包

来源:互联网 发布:java通过ip获取地区 编辑:程序博客网 时间:2024/05/23 12:43

题目描述:

  N只奶牛,每只奶牛拥有属性(height),书架高度B。求令奶牛叠加高度正好能够超过书架,并且超过值最小的那个excess高度。

 

解题思路:

  也是0/1背包,稍微有点变化的是容量上限值为(最大奶牛高度+书架高度)。最优子结构依旧是达到h高度时,最接近书架高度的奶牛迭加高度。

 

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 21
#define M 100000000

int height[N], f[M];
int max = 0, sum = 0;

main()
{
   int i, n, b, v;
   scanf("%d%d",&n, &b);
  for(i=1;i<=n;i++)
   {
     scanf("%d",&height[i]);
     max = max>height[i] ?  max:height[i];
     sum += height[i];
   }
  for(i=0;i<=sum;i++)
     f[i] = 0;
  
  for(i=1;i<=20;i++)
     for(v=b+max;v>height[i];v--)
        f[v] = (b-f[v]) < (b-f[v-height[i]]-height[i])?  f[v]: f[v-height[i]]+height[i] ;
     
   for(v=b;v<=b+max; v++)
     if(f[v]>=b)
     {
        printf("%d\n",f[v]-b);
        break;
     }
  // system("pause");
   return 0;
  
}

原创粉丝点击