关于01背包的尖锐的疑问?
动态规划方法解空间好像是以物品数(N)为横坐标, 以背包容量(M)为纵坐标形成的二维数组. 那么二维数组大小为M*N, 不知道对与不对?
如果是二叉树(决策树)的话, 解空间就是二叉树了, 节点数为2^N.
好像大家都以此为依据说, 动态规划方法比二叉树回溯方法好. 但我觉得如果是二叉树的话, 其实节点并不是2^N, 而是二叉树与M*N二维数组的交集, 即二叉树把背包容量超过M的节点都剪枝了. 如果是这样的话, 那其实二叉树的节点数要比M*N的大小要小的多. 因为M*N中有许多并不存在的节点了. 所以我想, 不论是M*N数组或是二叉树的解空间, 只要运用动态规划算法, 效率是差不多的.
另外我想问的一点是动态规划方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
在二叉树结构来看, 并不是取二个中的最大值, 正确的说法是取其中合法的一个.
因为, 二叉树中一个子节点只有一个父节点. 而他们的边要么为0(不放入), 要么为1(放入). 不存在一个父节点与一个子节点之间有二个边!
所以公式前面加max有误导之嫌, 应该改为f[i][v]=valid{f[i-1][v],f[i-1][v-c[i]]+w[i]} 不知道我的理解对吗?