卡码网 01背包问题 二维
题目链接:01背包问题 二维
踩坑:在考虑当前物品时,应先考虑当前的背包能不能放得下当前物品
思路:
- 动态数组的含义:dp[i][j]:物品[0, i]在容量为 j 的背包中的最大价值
- 递推公式:对于dp[i][j],如果不放入当前物品 i,其价值为dp[i-1][j],如果放入当前物品 i,其价值为dp[i-1][ j - weight[ i ] ]+price[i]。这里重点考虑的就是如何体现出放与不放
- 初始化动态数组:有递推公式可知,当前状态依赖其二维数组中上方与左上方的状态,因此应初始化第一行,第一列。
- 遍历顺序:因为当前状态依赖于上方与左上方,所以可以先遍历物品,再遍历背包,也可以先遍历背包,再遍历物品。
代码:
# include<iostream>
# include<vector>
using namespace std;
int main()
{
int n;
int c;
cin>>n>>c;
vector<int> w(n, 0);
for(int i = 0; i < n; i++)
{
int t;
cin>>t;
w[i] = t;
}
vector<int> p(n, 0);
for(int i = 0; i < n; i++)
{
int t;
cin>>t;
p[i] = t;
}
vector<vector<int>> dp(n,