01背包和数塔都是寒假看的,数塔还算明白,但01背包虽然会做其实也是背下来的,一直不是很清楚它的可行性,昨天老师讲了以后恍然大悟,和数塔类似生成了一颗二叉树;
利用数组/dfs 自下而上/自上而下 递推/搜索 直至推到最顶点答案出现;
图解:
图没工夫做了,手残= =、;
意思就是每件物品根据取或不取两种状态生成了这颗解答树,不难发现和数塔类似了吧,用一个一维数组保存每次决策后的结果即可;
其实本来和数塔一样是用二维数组表示的,但显然只用一维就可还大大节省了空间;
这就是一件物品一件物品决策的原因(以前困惑很久);
for(i=1;i<=n;i++)
for(j=m;j>=w[i];j--)
dp[j]=max{dp[j],dp[j-w[i]]+p[i]}; //检测选或不选的可行性