【代码随想录day36】【C++复健】1049. 最后一块石头的重量 II ; 494. 目标和 ;474.一和零

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

纠结了一下是要定义bagsize为sum/2还是sum/2+1,但在最后return的时候发现,如果设置成sum/2+1的话,没办法保证2*dpbagsize和sum之间哪个更大,所以选择了向下取整。

cpp 复制代码
class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int n = stones.size();
        int sum = 0;
        for(int i=0; i<stones.size(); i++){
            sum += stones[i];
        }
        int bagsize = sum/2;
        vector<int> dp(bagsize+1);
        for(int i=0; i<n; i++){
            for(int j=bagsize; j>=stones[i]; j--){
                dp[j] = max(dp[j], dp[j-stones[i]]+stones[i]);
            }
        }
        return sum - 2*dp[bagsize];
    }
};

494. 目标和

没被递推公式难住,但是却被初始化难住了,因为在我看来,dp0是0是1好像都能说得通,但是只有当dp0等于1的时候才能引导出正确的后续结果,那就按1来吧。

除此之外还忽略了对于特殊情况的处理逻辑,一个是目标小于sum的情况不行,还有就是当target+sum为奇数,这个时候无法用整数的bagsize算出来这个target+sum,此时也是无解的。但我没加这个处理条件,所以导致了错误的结果。

导致这问题的主要原因还是没搞清楚底下的for循环能处理什么,不能处理什么。

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

474.一和零

一开始写这个的时候,递推公式出现了问题,还以为是这样:

cpp 复制代码
dp[j][k] = dp[j-count[i][0]][k-count[i][1]] + 1;

但实际上并不是,我们还要和原始的dpjk之间去做一个大小的比较,因为其实现在,动态数组是一个二维的数组,我们会通过循环不断遍历这个二维数组,就像之前遍历一维数组那样。而我就是对整个遍历过程还是没有理解的很深刻,才会出现这样的问题。

cpp 复制代码
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        int len = strs.size();
        vector<vector<int>> count(len, vector<int>(2));
        for(int i=0; i<strs.size(); i++){
            for(int j = 0; j< strs[i].size(); j++){
                if(strs[i][j] == '0'){
                    count[i][0] += 1;
                }
                else if(strs[i][j] == '1'){
                    count[i][1] += 1;
                }
            }
        }
        vector<vector<int>> dp(m+1, vector<int>(n+1));
        for(int i=0; i<count.size(); i++){
            for(int j=m; j>=count[i][0]; j--){
                for(int k=n; k>=count[i][1]; k--){
                    dp[j][k] = max(dp[j][k], dp[j-count[i][0]][k-count[i][1]] + 1);
                }
            }
        }
        return dp[m][n];
    }
};
相关推荐
sheeta19985 分钟前
LeetCode 每日一题笔记 日期:2026.05.29 题目:3300. 最小元素
笔记·leetcode
_日拱一卒6 分钟前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM37 分钟前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro1 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
voidmort1 小时前
3. 微调(Fine-tuning)与强化学习(RL)的核心思想
python·深度学习·算法
人道领域2 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
QiLinkOS3 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
Irissgwe3 小时前
c++11(lambda表达式与包装器、线程库)
c++·c++11·lambda表达式·线程库·包装器·互斥量库·条件变量库
小白兔奶糖ovo4 小时前
【Leetcode】231. 2的幂
linux·算法·leetcode
xiaoxiaoxiaolll4 小时前
《Light: Science & Applications》合并BIC实现80倍阈值单模运行:超紧凑光子晶体激光器新突破
人工智能·算法·机器学习