看了极客时间里数据结构与算法中0-1背包问题不是很好理解,可能是变量多,也可能是变量名简略原因,所以简化了老师的代码(思想没变),并修改了变量名用c++实现。
老师源代码:
public int maxW = Integer.MIN_VALUE; //存储背包中物品总重量的最大值 // cw表示当前已经装进去的物品的重量和;i表示考察到哪个物品了; // w背包重量;items表示每个物品的重量;n表示物品个数 // 假设背包可承受重量100,物品个数10,物品重量存储在数组a中,那可以这样调用函数: // f(0, 0, a, 10, 100) public void f(int i, int cw, int[] items, int n, int w) { if (cw == w || i == n) { // cw==w表示装满了;i==n表示已经考察完所有的物品 if (cw > maxW) maxW = cw; return; } f(i+1, cw, items, n, w); if (cw + items[i] <= w) {// 已经超过可以背包承受的重量的时候,就不要再装了 f(i+1,cw + items[i], items, n, w); } }
我的代码:
1 // cw表示当前已经装进去的物品的重量和;i表示考察到哪个物品了; 2 // 假设背包可承受重量100,物品个数10,物品重量存储在数组a中,那可以这样调用函数:f(0, 0) 3 int nCurWeight = 0; //当前存储背包中物品总重量 4 int BagWeightMax = 100; //背包能承受的总重量 5 const int nTotalItemCount = 10; //道具总个数 6 int items[nTotalItemCount] = {1,5,2,21,4,51,2,55,112,32}; //每个道具重量 7 void f(int i, int cw) { 8 if (cw == BagWeightMax || i == nTotalItemCount) { // cw==BagWeightMax表示装满了;i==n表示已经考察完所有的物品 9 if (cw > nCurWeight) 10 nCurWeight = cw; 11 return; 12 } 13 f(i+1, cw); 14 if (cw + items[i] <= BagWeightMax) { 15 // 已经超过可以背包承受的重量的时候,就不要再装了,减枝法 16 f(i+1,cw + items[i]); 17 } 18 }