问题描述

  • 现有一个容量大小为V的背包和N件物品,每件物品有两个属性,体积和价值,请问这个背包最多能装价值为多少的物品?

输入描述

  • 第一行两个整数V和n。接下来n行,每行两个整数体积和价值。1≤N≤1000,1≤V≤20000。每件物品的体积和价值范围在[1,500]。

输出描述

  • 输出背包最多能装的物品价值。
  • 示例:
    6 3
    3 5
    2 4
    4 2
    输出
    9

思路

  • 分两种情况, 一种是放不放的下选择,一种是放不放的问题

代码实现

int test(std::vector<int>& A, std::vector<int>& V, int pack) {
    int row = A.size();
    int col = pack;

    std::vector<std::vector<int>> dp(row+1, std::vector<int>(col+1, 0));

    for(int i = 1; i <= row; ++i) {
        for(int j = 1; j <= col; ++j) {
            if(j < A[i-1]) {
                dp[i][j] = dp[i-1][j];
            } else {
                dp[i][j] = std::max(dp[i-1][j], dp[i-A[i-1]]+V[i-1]);
            }
        }
    }

    return dp[row][col];
}





int main()
{
    int pack, num;
    while(std::cin >> pack >> num) {
        std::vector<int> A(num);
        std::vector<int> V(num);

        for(int i = 0; i < num; ++i) {
            std::cin >> A[i] >> V[i];
        }

        std::cout << test(A, V, pack) << std::endl;
    }
    return 0;
}

// 一维空间优化
int test(std::vector<int>& A, std::vector<int>& V, int pack) {
    std::vector<int> dp(pack+1, 0);

    for(int i = 0; i < A.size(); ++i) {
        for(int j = pack; j >= A[i]; --j) {
            dp[j] = std::max(dp[j], dp[j-A[i]]+V[i]);
        }
    }

    return dp[pack];
}