在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
总结状态转义方程为:dp[i][j]=max(dp[i−1][j],dp[i−1][j−A[i]]+A[i])
复杂度分析
n表示物品件数,m表示背包容量
- 时间复杂度:O(nm)

这篇博客探讨了如何使用动态规划解决阿里面试中的一道背包问题,详细介绍了算法思路、复杂度分析以及代码实现,并通过优化将空间复杂度降低到O(m)。
最低0.47元/天 解锁文章
1173

被折叠的 条评论
为什么被折叠?



