DP-01背包
套路:最大值 , 最优,最大,最小,最长,计数
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。求最大价值
先暴力递归式求解
int w[10] = { 1, 4, 3, 0, 0, 0, 0, 0, 0 }; int v[10] = { 4, 6, 3, 0, 0, 0, 0, 0, 0 }; //0 5 int f(int x, int W) { if (W < w[x])return f(x + 1, W);//剩余可用重量 小于当前物体重量 if (W <= 0)return 0;//剩余重量 返回价值0 if (x >= 4)return 0; int ret = max(f(x + 1, W - w[x]) + v[x], f(x + 1, W));// 拿和不拿 return ret; }
然后利用数组来存储已经计算过了的值,,递归到需要返回的时候
因为递归式的重量是依次递减,然后递推至最大
物品index 是在最大依次减小 所以DP循环的顺序就可以这样写
for (int xx = num - 1; xx >= 0; xx--) { for (int ww = 0; ww <= MAX; ww++) { if (ww < w[xx]) { arr[xx][ww] = arr[xx + 1][ww]; } else { int a = arr[xx + 1][ww - w[xx]] + v[xx];//拿 int b = arr[xx + 1][ww];// 不拿 arr[xx][ww] = max(a, b); } } }