思路:动态规划。背包剩余容量为j,已决定前i个物品是否放入时,最大价值为dp[i][j](此问题中为放入的物品总重量)
最优子结构:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @return: The maximum size
*/
int backPack(int m, vector<int> A) {
// write your code here
vector<vector<int>> dp(A.size(), vector<int>(m+1, 0));
for (int i=1;i<=m;i++)
{
if (i >= A[0])
dp[0][i] = A[0];
}
for (int i=1;i<A.size();i++)
{
for (int j=1;j<=m;j++)
{
if (j >= A[i])
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - A[i]] + A[i]);
else dp[i][j] = dp[i - 1][j];
}
}
return dp[A.size()-1][m];
}
protected:
inline int max(int a, int b) {
return a < b ? b : a;
}
};
int main(void) {
system("pause");
}
背包问题动态规划解法
本文介绍了一种解决背包问题的动态规划方法。通过构建二维动态规划数组 dp[i][j] 来记录当背包容量为 j 且考虑了前 i 个物品时的最大价值(即放入的物品总重量)。文章提供了完整的 C++ 实现代码,并详细解释了状态转移方程。
180

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



