背包问题是一个经典的动态规划问题,其基本思想是在给定容量的情况下,选出一些物品使其价值最大化。这里介绍一下c++实现背包问题的具体方法。
首先声明一个二维数组dp[i][j]表示用前i个物品去填容量为j的背包所能获得的最大价值。其中dp[0][j]=0表示用0个物品去填任意容量的背包所能获得的最大价值都是0,dp[i][0]=0表示在不填入任何物品的情况下,背包价值也是0。
然后,我们就可以根据状态转移方程进行求解了。状态转移方程可以表示为:
当j>=w[i]时,dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
当j<w[i]时,dp[i][j]=dp[i-1][j];
其中,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int w[N], v[N];
int dp[N][N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> w[i] >> v[i];
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
if (j >= w[i]) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
else dp[i][j] = dp[i - 1][j];
cout << dp[n][m] << endl;
return 0;
}