01背包练习题

时间:2023-02-12 22:42:45

01背包练习题

题目



一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。

给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。
测试样例:

[1,2,3],[1,2,3],3,6

返回:6

解析

class Backpack {
public:
    int maxValue(vector<int> w, vector<int> v, int n, int cap) {
        // write code here

        vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));

        for (int i = 1; i <= n;i++)
        {
            for (int j = 1; j <= cap ;j++)
            {
                if (j>=w[i-1]) //w.v下标-1
                {
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1]);
                }
                else
                {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[n][cap];
    }

    int maxValue_(vector<int> w, vector<int> v, int n, int cap) {
        // write code here

        vector<int> dp(cap + 1, 0);
        vector<int> pre(cap + 1, 0); //记录上一行的dp值
        for (int i = 0; i < n;i++)
        {
            for (int j = 1; j <= cap;j++)
            {
                if (j>=w[i])
                {
                    dp[j] = max(pre[j],pre[j-w[i]]+v[i] );
                }
                else
                {
                    dp[j] = pre[j];
                }
            }
            pre = dp;
        }
        return dp[cap];
    }
};

Refernce