Chinaunix首页 | 论坛 | 博客
  • 博客访问: 671454
  • 博文数量: 141
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1114
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,即当司令也当兵!

文章分类

全部博文(141)

分类: LINUX

2016-10-26 08:33:59

01背包问题


问题描述

有N件物品和一个容量为C的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的总重量和不超过背包容量,且价值总和最大。

问题分析

这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

假如前k个物品放入背包容量c的背包中,可以获取最大价值是fv(k, c), 那么单独考虑第k个物品:
        如果k放入背包中,那么此背包的价值 = 前k-1个物品放入背包容量为c-w[k]所获取最大价值 + v[k]
        如果k不放入背包中,那么此背包的价值 = 前k-1个物品放入背包容量为c所获取的最大价值
即:
fv(k, c) = MAX{fv(k-1, c), fv(k-1, c-w[k]) + vk}


例如,现在有物品
P1(1,3), P2(2,3), P3(2,6), P4(3,8), P5(4,9)


     ^前k件物品
     |
5-4| 3  6  9  11 14 17
4-3| 3  6  9  11 14 17
3-2| 3  6  9  9  12 12
2-2| 3  3  6  6  6  6
1-1| 3  3  3  3  3  3
 ---------------------------->背包容量
       1  2  3  4  5  6


代码实现如下:

点击(此处)折叠或打开

  1. int max(int a, int b);

  2. int findMaxValue_01Packge(int *weight, int *value, int len, int cpt)
  3. {
  4.     int *fvK_1; // 这里其实只需要一个数组就可以了,两个数组只是为了更清晰的看到每一层迭代过程
  5.     int *fvK;
  6.     int *tmp;
  7.     int maxValue = 0;
  8.     
  9.     int i, j;
  10.     
  11.     fvK_1 = (int*)calloc(sizeof(int) * (cpt + 1));
  12.     fvK = (int*)calloc(sizeof(int) * (cpt +1));
  13.     
  14.     if (NULL == fvK || NULL == fvK_1)
  15.     {
  16.         if (fvK_1)
  17.             free(fvK_1);
  18.         
  19.         if (fvK)
  20.             free(fvK);
  21.         return -1;
  22.     }
  23.     for (i = 1; i <= cpt; i++)
  24.     {
  25.         if (i >= weight[0])
  26.             fvK_1[i] = value[0];
  27.     }
  28.     
  29.     for (j = 1; j < len; j++)
  30.     {
  31.         for(i = 1; i <= cpt; i++)
  32.         {
  33.             fvK[i] = max(fvK_1[i], (i >= weight[j] ? value[j] + fvK_1[i - weight[j]] : 0));
  34.         }
  35.         
  36.         // swap fvK and fvK_1
  37.         tmp = fvK;
  38.         fvK = fvK_1;
  39.         fvK_1 = tmp;
  40.     }
  41.     
  42.     maxValue = fvK_1[cpt];
  43.     
  44.     free(fvK);
  45.     free(fvK_1);
  46.     return maxValue;
  47. }


阅读(2801) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~