C++:c++背包问题详细介绍

        背包问题是一个经典的动态规划问题,其基本思想是在给定容量的情况下,选出一些物品使其价值最大化。这里介绍一下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;
}

猜你喜欢

转载自blog.csdn.net/SYC20110120/article/details/132916423