Backpack

Backpack (0 - 1 背包问题)

0-1 knapsack problem

单次选择 + 最大体积

Question

Given n items with size Ai, an integer m denotes the size of a backpack. How full you can fill this backpack?

Notice

You can not divide any item into small pieces.

Example

If we have 4 items with size [2, 3, 5, 7], the backpack size is 11, we can select [2, 3, 5], so that the max size we can fill this backpack is 10. If the backpack size is 12. we can select [2, 3, 7] so that we can fulfill the backpack.

You function should return the max size we can fill in the given backpack.

Challenge

O(n x m) time and O(m) memory.

O(n x m) memory is also acceptable if you do not know how to optimize memory.

Tags

LintCode Copyright Dynamic Programming Backpack

Related Problems

Medium Backpack VI 30 % Medium Backpack V 38 % Medium Backpack IV 36 % Hard Backpack III 50 % Medium Backpack II 37 %

Analysis

背包问题序列I

要点: 单次选择+最大体积

常用是DP,但也可以用递归+记忆化搜索来做。

这个问题没有给每个物品的价值,也没有问最多能获得多少价值,而是问最多能装多满。

实际上在这里,如果我们把每个物品的大小当作每个物品的价值,就可以完美解决这个问题。

Solution

Preferred Solution

2D - DP

状态:

dp[i][j] - 代表在前 i 件物品中选择若干件,这若干件物品的体积和不超过 j 的情况下,所能获得的最大容量

外层循环A[i], 内层循环j

状态转移:

2D DP

Or Another 2D DP

1D - DP

State: 数组dp[i]表示书包空间为i的时候能装的A物品最大容量

动规经典题目,用数组dp[i]表示书包空间为i的时候能装的A物品最大容量。

两次循环,外部遍历数组A,内部反向遍历数组dp,若j即背包容量大于等于物品体积A[i],则取前i - 1次循环求得的最大容量dp[j],和背包体积为j - A[i]时的最大容量dp[j - A[i]]与第i个物品体积A[i]之和即dp[j - A[i]] + A[i]的较大值,作为本次循环后的最大容量dp[i]

注意dp[]的空间要给m+1,因为我们要求的是第m+1个值dp[m],否则会抛出OutOfBoundException。

一维数组优化:

在第 i 层循环初 dp[j] 存的相当于 dp[i - 1][j] 的值,因为在更新dp[j]时用到了 dp[j - A[i]], 由于内层循环倒序,所以dp[j - A[i]] 未被更新,因此代表了dp[i-1][j - A[i]]

1D space optimized:

1D DP

j = m, m-1, ..., A[i]

Another DP Approach (NOT Preferred)

2D with O(n * m) time and O(n * m) space.

动态规划4要素

  • State:

    • f[i][S] “前i”个物品,取出一些能否组成和为S

  • Function:

    • f[i][S] = f[i-1][S - a[i]] or f[i-1][S]

  • Initialize:

    • f[i][0] = true; f[0][1..target] = false

  • Answer:

    • 检查所有的f[n][j]

O(n * S) , 滚动数组优化

注意这里A[i - 1]的数组下标,因为新建的是i = 1, ..., A.length

1D version with O(n * m) time and O(m) memory.

https://www.jiuzhang.com/solution/backpack/#tag-other

Reference

Last updated

Was this helpful?