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