背包问题(01类型),又称0-1背包问题,是一种经典的组合优化问题。给定一系列物品和一个容量有限的背包,在每个物品只能选择拿取或不拿取的情况下,如何选取部分物品使得总价值最大?此问题在计算机科学中具有广泛应用。
问题描述:给定n个物品和一个容量为capacity的背包,其中第i个物品的大小是w[i],价值是v[i]。如何选择这些物品装入背包以使背包中物品的价值最大?
思路分析:
使用动态规划方法来解决这个问题。
定义动态规划数组dp[i][j]表示从前i个物品中挑选若干放入容量为j的背包所能获得的最大总价值。
面对第i个物品时,有两种决策:放置或不放置。具体如下:
1. 当当前背包剩余空间大于等于第i个物品大小(即 j >= w[i])时:
- 不放该物品的情况下,dp[i][j] = dp[i-1][j]
- 放入该物品,则需考虑前(i-1)个物品装填后的最大价值再加上当前物品的价值,因此有 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
2. 当背包无法容纳第i个物品时(即 j < w[i]),则只能选择不放置该物品:
- 此情况下dp[i][j] = dp[i-1][j]
通过上述方法,可以逐步构建出最优解。