0-1背包问题
1.定义dp数组以及确定含义
2.确定递推公式
3.初始化dp
4.确定遍历方式(先物品,后重量)
5.手推验证一下
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int m,n;//m表示物品种类数,n表示背包大小
vector<int> weight(m,0);
vector<int> value(m,0);
void solve()
{
//定义dp, dp[i][j]代表背包为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值
vector<vector<int>> dp(m,vector<int>(n+1,0));
//初始化dp
for(int j=weight[0];j<=n;j++)
{
dp[0][j]=value[0];
}
//先遍历物品,再遍历重量.注意这里i从1开始
for(int i=1;i<m;i++)
{
for(int j=0;j<=n;j++)
{
//物品要么放或者不放(装不下就不放喽)
if(j<weight[i])dp[i][j]=dp[i-1][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
}
}
cout<<dp[m-1][n];
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>m>>n;
for(int i=0;i<m;i++)
{
int x;cin>>x;
weight.push_back(x);
}
for(int i=0;i<m;i++)
{
int x;cin>>x;
value.push_back(x);
}
solve();
return 0;
}