InBlock.gif //重量数组w[], 价值数组v[], 包的最大容量wCApacity, map[begin][wCapacity]记录从begin到end容量不超过wCapacity的最大价值
InBlock.gif //重量数组的开始位置 begin, 结束位置 end
InBlock.gif
InBlock.gif // 当begin != end时
InBlock.gif //map(begin,wCapacity) =
InBlock.gif //(Max(map(begin+1,wCapacity),map(begin+1,wCapacity-w[i] )+v[i])    (wCapacity>=w[i])
InBlock.gif // map(begin+1,wCapacity)                             (0 <= wCapacity <w[i]))
InBlock.gif //当begin == end 时
InBlock.gif //map(begin, wCapacity) =
InBlock.gif //v[begin] wcapcity >= w[n]
InBlock.gif //0                 0 <=wCapacity < w[n]
InBlock.gif#include <iostream>
InBlock.gif using namespace std;
InBlock.gif
InBlock.gif#define    N 4 //数组大小
InBlock.gif#define MaxC 12 //包容量的最大值
InBlock.gif#define Max(a,b) ((a >= b)? a : b)
InBlock.gif#define Min(a,b) ((a <= b)? a : b)
InBlock.gif
InBlock.gif
InBlock.gif //01背包问题的递归算法
InBlock.gif int knapsack( int begin, int end, int wCapacity, int map[][MaxC], int* w, int* v)
InBlock.gif{
InBlock.gif   if (wCapacity < 0)
InBlock.gif  {
InBlock.gif    printf( "The value of wCapacity is invalid!\n");
InBlock.gif     return -1;
InBlock.gif  }
InBlock.gif   if (begin == end)
InBlock.gif  {
InBlock.gif     if (wCapacity >= w[end])
InBlock.gif    {
InBlock.gif      map[begin][wCapacity] = v[end];
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif      map[begin][wCapacity] = 0;
InBlock.gif    }
InBlock.gif     return map[begin][wCapacity];
InBlock.gif  }
InBlock.gif   else
InBlock.gif  {
InBlock.gif     if (wCapacity >= 0 && wCapacity < w[begin])
InBlock.gif    {
InBlock.gif      map[begin][wCapacity] = knapsack(begin+1, end, wCapacity, map, v, w);
InBlock.gif       return map[begin][wCapacity];
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif      map[begin][wCapacity] = Max(knapsack(begin+1,end,wCapacity, map, v, w), knapsack(begin+1,end, wCapacity-w[begin],map, v, w) + v[begin]);
InBlock.gif       return map[begin][wCapacity];
InBlock.gif    }
InBlock.gif  }
InBlock.gif    
InBlock.gif}
InBlock.gif
InBlock.gif void traceBack( int begin, int end, int wCapacity, int map[][MaxC], int * w, int * x)
InBlock.gif{
InBlock.gif   int wCap = wCapacity;
InBlock.gif   for ( int k = begin; k <= end - 1; k++)
InBlock.gif  {    
InBlock.gif     if (map[k][wCap] == map[k+1][wCap])
InBlock.gif    {
InBlock.gif      x[k] = 0;    
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif      x[k] = 1;
InBlock.gif      wCap -= w[k];
InBlock.gif    }
InBlock.gif  }
InBlock.gif  x[end] = (map[end][wCap] == 0)?0:1;
InBlock.gif
InBlock.gif}
InBlock.gif //01背包问题的非递归算法
InBlock.gif
InBlock.gif int noknapsack( int begin, int end, int wCapacity, int map[][MaxC], int * w, int * v)
InBlock.gif{
InBlock.gif   int i, j;
InBlock.gif
InBlock.gif   for (i = 0; i <= wCapacity; i++)
InBlock.gif  {
InBlock.gif     if (i >= w[end])
InBlock.gif    {
InBlock.gif      map[end][i] = v[end];
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif      map[end][i] = 0;
InBlock.gif    }
InBlock.gif  }
InBlock.gif   for (i = end - 1; i >= 0; i--)
InBlock.gif  {
InBlock.gif     for (j = 0; j <= wCapacity; j++)
InBlock.gif    {
InBlock.gif       if (j >= w[i])
InBlock.gif      {
InBlock.gif        map[i][j] = Max(map[i+1][j], map[i+1][j - w[i]] + v[i]);
InBlock.gif      }
InBlock.gif       else
InBlock.gif      {
InBlock.gif        map[i][j] = map[i+1][j];
InBlock.gif      }
InBlock.gif    }
InBlock.gif  }
InBlock.gif   return map[begin][wCapacity];
InBlock.gif}
InBlock.gif
InBlock.gif int main()
InBlock.gif{
InBlock.gif   int w[N] = {2, 3, 4, 5};
InBlock.gif   int v[N] = {10, 30, 40, 25};
InBlock.gif   int map[N][MaxC];
InBlock.gif   int x[N];
InBlock.gif   int wCapacity = 7;
InBlock.gif //  int maxValue = knapsack(0, N - 1, wCapacity, map, w, v);
InBlock.gif   int maxValue = noknapsack(0, N - 1, wCapacity, map, w, v);
InBlock.gif  traceBack(0, N - 1, wCapacity, map, w, x);
InBlock.gif   for ( int i = 0; i < N; i++)
InBlock.gif  {
InBlock.gif    printf( "%d,", x[i]);    
InBlock.gif  }
InBlock.gif  printf( "\nMaxValue is: %d \n", maxValue);
InBlock.gif   return 0;
InBlock.gif}