class Solution
{
// 定义dp数组:dp[j]表示背包承重为j时能获得的最大价值
// 初始化全为0(未放任何物品时,价值为0)
int dp[1010] = {0};
public:
// 函数参数:V(背包最大承重)、n(物品数量)、vw(物品的重量和价值数组)
int knapsack(int V, int n, vector<vector<int> >& vw)
{
// 第一层循环:遍历每件物品(0-1背包中每件物品只能选一次)
for(int i = 0; i < n; i++)
{
// 第二层循环:从背包最大承重V开始,倒序遍历到当前物品的重量vw[i][0]
for(int j = V; j >= vw[i][0]; j--)
{
// 状态转移方程:
// 对于承重j,有两种选择:不选第i件物品(价值为dp[j]),或选第i件物品(价值为dp[j - 物品重量] + 物品价值)
// 取两种选择的最大值,更新dp[j]
dp[j] = max(dp[j], dp[j - vw[i][0]] + vw[i][1]);
}
}
// 返回背包承重为V时的最大价值
return dp[V];
}
};