编程题
求解 01 背包问题 ### 题目描述 实现一个算法求解 01 背包问题。背包问题的介绍如下: - 已知一个容量为 $total\_weight$ 的背包,有不同重量不同价值的物品,问怎样在背包容量限制下达到利益最大化。 - 01 背包问题要求每个物品只有一个,可以选择放入或者不放入背包。 背包问题求解方法的介绍如下: - 用符号 $V_i$ 表示第 $i$ 个物品的价值,$W_i$ 表示第 $i$ 个物品的体积,$V_{i,j}$ 表示当前背包容量为 $j$ 时,前 $i$ 个物品最佳组合对应的价值。 - 对于当前第 $i$ 个商品,如果包的容量比该物品体积小,即 $j < W_i$。那么此时的价值与前 $i-1$ 个的价值是一样的,即 $V_{i, j} = V_{i - 1, j}$。 - 对于当前第 $i$ 个商品,如果包的容量能够装下该物品,即 $W_i \leq j$。此时需要判断装或者不装这个物品的价值对比,选择使价值更大的情况,即 $V_{i,j} = \max {(V_i + V_{i - 1,j - W_i}, V_{i - 1, j})}$。 通过最优解回溯法找到解的组成: - 当 $V_{i, j} = V_{i-1, j}$时,说明没有选择第 $i$ 个物品。 - 当 $V_{i, j} = V_{i - 1,j - W_i}$ 时,说明装了第 $i$ 个商品。 - 从 $i,j$ 的最大值一直遍历到 $i=0$ ,则找到了所有解。 ### 输入描述 第一行为两个数字 $total\_weight、N$,均不超过 1000。$total\_weight$ 含义见题干,$N$ 为物品数量。 接下来 $N$ 行,每行两个数字 $W_i$、$V_i$,均不超过 1000。含义见题干。 ### 输出描述 输出一行,为在背包容量限制下的最大化利益。 ### 输入输出样例 #### 示例 > 输入 ```txt 8 5 3 4 5 5 1 2 2 1 2 3 ``` > 输出 ```txt 10 ```
查看答案
赣ICP备20007335号-2