在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]。
你不可以将物品进行切割。
样例 1:
输入: [3,4,8,5], backpack size=10
输出: 9
样例 2:
输入: [2,3,5,7], backpack size=12
输出: 12
算法:DP
从已知的题目中,可以总结出以下两点:
- 每件物品只有一种
- 每件物品最多选择一次
那么考虑对于前i件的物品在容量为w的背包下,最大的装载量是多少,由此可以总结出对应的子结构,进行动态规划。
算法思路
设计dp数组dp[n][m],用dp[i][j]表示第i个物品在容量为j的背包下,最大的装载量。
在这个问题中,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i−1件物品的问题:
- 如果不放第i件物品,可得dp[i][j]=dp[i−1][j]
- 如果放了第i件物品,可得dp[i][j]=dp[i−1][j−A[i]]+Ai
总结状态转义方程为