被这个01背包的策略害惨了,看背包九讲,一直没看懂他的伪代码,主要是对伪代码不太了解,ru:
i=N v=V while(i>0) if(g[i][v]==0) print "未选第i项物品" else if(g[i][v]==1) print "选了第i项物品" v=v-c[i]/*他的位置和print对其,这他就属于else这句里面。。。。。。。。。。。。。。。 可以这么理解,每个物品在背包容量为任意值是都有一个属于与不选的状态与之对应。 由于对背包的循环在外层的所以每次是先求出在容量为任意v的情况下, 为得到最大价值,这个背包是否被选的状态,以后的循环背包i的在任意容量下的是否 被选的状态是不会改变的。又由于i是递增的(我们的对递推公式的定义是:f[i][j]为: “前i件”物放到容量为j的背包中的最大价值),故下标小的被包被优先考虑了, 从而输出是必须从n往前递推(前n件放到背包容量为V的背包中)。 而如果输出是i从前往后推的话,(V对应1,为前一件放到背包容量V的背包中。) 这就与定义相悖了*/