0-1背包
每件物品数量只有一个
二维版本
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
int n,V;
cin>>n>>V;
vector<int>weight(n+1,0);
vector<int>value(n+1,0);
for(int i = 1;i<=n;i++)
{
cin>>weight[i]>>value[i];
}
vector<vector<int>>dp(n+1,vector<int>(V+1,0));
for(int i = 1;i<=n;i++)
{
for(int j = 0;j<=V;j++)
{
if(j>=weight[i]) dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
else dp[i][j] = dp[i-1][j];
}
}
cout<<dp[n][V];
return 0;
}
0-1背包->转化为一维版本:倒序遍历
完全背包
每件物品数量有无数个
二维版本
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N,V;
cin>>N>>V;
vector<int>weight(N+1,0);
vector<int>value(N+1,0);
vector<vector<int>>dp(N+1,vector<int>(V+1));
for(int i=1;i<=N;i++) cin>>weight[i]>>value[i];
for(int i=1;i<=N;i++)
{
for(int j=0;j<=V;j++)
{
if(j<weight[i]) dp[i][j] = dp[i-1][j];
else dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);
}
}
cout<<dp[N][V];
}
完全背包转化为一维版本->正序遍历
多重背包
每件物品数量是有限个
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N,V;
cin>>N>>V;
vector<int>w(N+1,0);
vector<int>value(N+1,0);
vector<int>s(N+1,0);
vector<vector<int>>dp(N+1,vector<int>(V+1,0));
for(int i=1;i<=N;i++) cin>>w[i]>>value[i]>>s[i];
for(int i = 1;i<=N;i++)
{
for(int j = 0;j<=V;j++)
{
for(int k = 0;k<=s[i]&&k*w[i]<=j;k++)
{
dp[i][j] = max(dp[i][j],dp[i-1][j-k*w[i]]+k*value[i]);
}
}
}
cout<<dp[N][V]<<endl;
return 0;
}