代码随想录Day42

99 阅读1分钟

image.png 背包问题,启动!

void test_2d_bag_problem() {
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    int bagweight = 4;

    // 二维数组
    vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));

    // 初始化
    // 省略的一步:如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。
    // dp[0][j]即i为0,存放编号0的物品时,各个容量的背包所能存放的最大价值。很明显j<weight[0]的时候,dp[0][j]应该是0,j>weight[0]时,dp[0][j]应该是value[0],因为背包容量足够放编号0物品。
    for (int j = weight[0]; j <= bagweight; j++) {
        dp[0][j] = value[0];
    }

    // weight数组的大小 就是物品的个数
    for (int i = 1; i < weight.size(); i++) { // 遍历物品
        for (int j = 0; j <= bagweight; j++) { // 遍历背包容量
            if (j < weight[i]) {
                dp[i][j] = dp[i - 1][j]; // 物品太大装不进去,价值和上一件物品的最优解一致
            } else {
                // dp[i - 1][j]是选择不放物品
                // dp[i - 1][j - weight[i]] + value[i]是选择放物品
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
            }
        }
    }

    cout << dp[weight.size() - 1][bagweight] << endl;
}

void test_1d_bag_problem() {
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    int bagweight = 4;

    // 初始化
    vector<int> dp(bagweight + 1, 0);
    for (int i = 0; i < weight.size(); i++) {
        for (int j = bagweight; j >= weight[i]; j--) {
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
        }
    }
    cout << dp[bagweight] << endl;
}

int main() {
    test_1d_bag_problem();
}

416. 分割等和子集

力扣题目链接

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        vector<int> dp(10001, 0);
        sum = accumulate(nums.begin(), nums.end(), 0);
        if (sum % 2 == 1) {
            return false;
        }
        int target = sum / 2;
        for (int i = 0; i < nums.size(); ++i) {
            for (int j = target; j >= nums[i]; --j) {
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
            }
        }
        if (dp[target] == target) {
            return true;
        } else {
            return false;
        }
    }
};