完全背包问题是一种动态规划问题,它的特点是每种物品可以取无限次,而不是只能取一次。
一个例子是:有一个背包的容积为5,有4种物品,每种物品的体积和价值分别为(1, 2), (2, 4), (3, 4), (4, 5)。求在不超过背包容积的情况下,能装入的最大价值是多少?
物品的信息如下:
| 物品编号 | 体积 | 价值 |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 2 | 4 |
| 3 | 3 | 4 |
| 4 | 4 | 5 |
一个可能的动态规划表如下:
| i\j | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 2 | 4 | 6 | 8 | 10 |
| 2 | 0 | 2 | 4 | 6 | 8 | 10 |
| 3 | 0 | 2 | 4 | 6 | 8 | 10 |
| 4 | 0 | 2 | 4 | 6 | 8 | 10 |
其中,i表示前i种物品,j表示背包的剩余容量,表格中的值表示最大价值。加粗的部分表示状态转移方程的更新。
状态转移方程可以表示为:
dp[i][j]=max(dp[i−1][j],dp[i][j−v[i]]+w[i])
其中,dp[i][j]表示前i种物品装入剩余容量为j的背包的最大价值,v[i]和w[i]分别表示第i种物品的体积和价值。
从表格中可以看出,最终的答案是10,即装入两个体积为1,价值为2的物品和一个体积为3,价值为4的物品。