自从开始学算法,动态规划就一直是我心中的一道阴影。也怪了,这个算法的原理我看明白了,可总是写不出程序来。具体地说,是0/1背包问题
让我感到头痛。
这次又碰到了0/1背包问题,想自己摸索出算法来,结果想了两天,也没想出来(看来当时对原理理解的还是不深)。因为在我的思考过程中,上界总是作为一个具体的值出现的,脑子根本就没往函数、区间的表示方式那个方向转。如果这个上界是具体的数值,那么每个子问题都是独一无二的,就不存在最优子结构了,也就找不到使用动态规划的方法。如果将上界设为一个未知数,用函数来表示,而函数的取值空间是一样的,都是整个实数域。这样,就很容易发现最有子结构了,并且问题的重叠部分也显示出来了。“动一子而满盘皆活”,变上界值为变量,在函数的级别上复用,太妙了!