【代码随想录算法训练营第四十三天 | LeetCode1049. 最后一块石头的重量 II 、494. 目标和、474.一和零】

代码随想录算法训练营第四十三天 | LeetCode1049. 最后一块石头的重量 II 、494. 目标和、474.一和零


一、1049. 最后一块石头的重量 II

解题代码C++:

cpp 复制代码
class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        vector<int> dp(15001, 0);
        int sum = 0;
        for (int i = 0; i < stones.size(); i++) sum += stones[i];
        int target = sum / 2;
        for (int i = 0; i < stones.size(); i++) { // 遍历物品
            for (int j = target; j >= stones[i]; j--) { // 遍历背包
                dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
            }
        }
        return sum - dp[target] - dp[target];
    }
};

题目链接/文章讲解/视频讲解:
https://programmercarl.com/1049.最后一块石头的重量II.html



二、494. 目标和

解题代码C++:

cpp 复制代码
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) sum += nums[i];
        if (abs(S) > sum) return 0; // 此时没有方案
        if ((S + sum) % 2 == 1) return 0; // 此时没有方案
        int bagSize = (S + sum) / 2;
        vector<int> dp(bagSize + 1, 0);
        dp[0] = 1;
        for (int i = 0; i < nums.size(); i++) {
            for (int j = bagSize; j >= nums[i]; j--) {
                dp[j] += dp[j - nums[i]];
            }
        }
        return dp[bagSize];
    }
};

题目链接/文章讲解/视频讲解:
https://programmercarl.com/0494.目标和.html



三、474.一和零

解题代码C++:

cpp 复制代码
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); // 默认初始化0
        for (string str : strs) { // 遍历物品
            int oneNum = 0, zeroNum = 0;
            for (char c : str) {
                if (c == '0') zeroNum++;
                else oneNum++;
            }
            for (int i = m; i >= zeroNum; i--) { // 遍历背包容量且从后向前遍历!
                for (int j = n; j >= oneNum; j--) {
                    dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
                }
            }
        }
        return dp[m][n];
    }
};

题目链接/文章讲解/视频讲解:
https://programmercarl.com/0474.一和零.html

相关推荐
Via_Neo4 分钟前
桶排序算法
算法·排序算法
斯维赤24 分钟前
每天学习一个小算法:快速排序
java·python·学习·算法·排序算法
王老师青少年编程44 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:雷达安装
c++·算法·贪心·csp·信奥赛·区间贪心·雷达安装
elseif1231 小时前
分组背包1
c++·学习·算法
睡觉就不困鸭1 小时前
第11天 删除有序数组中的重复项 II
数据结构
im_AMBER1 小时前
Leetcode 160 最小覆盖子串 | 串联所有单词的子串
开发语言·javascript·数据结构·算法·leetcode
Rabitebla1 小时前
【数据结构】动态顺序表实现详解:从原理到接口设计(面试视角)
c语言·开发语言·数据结构·c++·面试·职场和发展
狐璃同学1 小时前
数据结构(1)三要素
数据结构·算法
列星随旋1 小时前
拓扑排序(Kahn算法)
算法
Hello!!!!!!1 小时前
C++基础(六)——数组与字符串
c++·算法