C语言那个背包问题的算法。要口述。不要复制的。

如题所述

就是用二维状态F[i][j]表示当前的最大价值,i为第几个东西,j为背包大小,对于第i个物品有价值v[i]j,和大小s[i],那么转移方程为f[i][n] = max(f[i-1][n-s[i]] + v[i],f[i][n]) 如果是物品只有一个对于每个i你就从背包大小n for到0就可以了,这里需要保证n-s[i] >= 0。如果是物品无穷多那么从0for到n就可以了。。
纯手打。。追问

怎么查找的。算法啊

我就是看不懂转移方程

我就是看不懂转移方程

用白话解释一下方程啊

额额

额额

追答

就是对于第i个物品,当前如果总共占j个空间,那么可能不选这个物品,从之前i-1个物品时就已经占了j个空间,或者选这个物品,那么i-1个物品时占了j-s[i]个空间。其实背包问题就是个枚举,只不过稍微聪明了一下,存了一下之前枚举过的大小的最优解,当后面一个物品要用这个状态时直接给出之前求出的部分。楼主可以学一下记忆化搜索,其实就是这种思想的。

追问

射了

谢了

温馨提示:答案为网友推荐,仅供参考
相似回答