首页 > 编程语言 >代码随想录算法训练营第四十二天 | 1049最后一块石头的重量II 494.目标和 474.一和零

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

时间:2024-07-01 14:32:21浏览次数:1  
标签:stones 遍历 nums int 随想录 II 第四十二 dp left

1049.最后一块石头的重量

题目链接 文章讲解 视频讲解

解题思路:
  将石头尽量分为相等的两堆,两堆最差即为所求结果
  石头的重量就是石头的价值

动规五部曲:

  • dp[j]:表示背包容量为j时可以装的石头的总价值
  • 递推公式:dp[j] = max(dp[j], dp[j-stones[i]] + stones[i]
  • 初始化:均初始化为0
  • 遍历顺序:先遍历石头后遍历背包
  • 打印dp数组
class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int weight = 0;
        for(int val : stones) weight += val;
        int capcity = weight / 2;

        // dp[j] 表示容量为j的背包装的石头的总价值最大为多少
        vector<int> dp(capcity + 1);
        for(int j = 0; j <= capcity; ++j) dp[j] = 0;

        // 递推公式: dp[j] = max(dp[j], dp[j-weight[i]] + value[i])

        // 初始化:均初始化为0
        for(int j = 0; j < capcity; ++j) dp[j] = 0;

        // 先遍历石头后遍历背包
        for(int i = 0; i < stones.size(); ++i) {
            for(int j = capcity; j >= stones[i]; --j) {
                dp[j] = max(dp[j], dp[j-stones[i]] + stones[i]);
            }
        }
        return weight - (dp[capcity] << 1);

    }
};

494.目标和

题目链接 文章讲解 视频讲解

思路:将数组分为两个集合left全部存整数,target全部存负数
那么满足:left + right = sum; left - right = target;
计算得left = (sum + target) / 2;
left即为背包的容量

动规五部曲:

  • dp[j]:装满容量为j的背包有dp[j]种方法
  • 递推公式:dp[j] += dp[j - nums[i]]
  • 初始化:dp[0] = 1, 其他初始化为0
  • 遍历顺序:先遍历物品后遍历背包,背包倒序遍历
  • 打印dp数组
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0;
        for(int val : nums) sum += val;
        if((sum + target) % 2 == 1) return 0;
        if(abs(target) > sum) return 0;
        int left = (sum + target) >> 1;

        // dp[j]: 表示容量为j的背包装哪些数可以正好装满
        vector<int> dp(left + 1, 0);

        // 递推公式: dp[j] = dp[j], dp[j - nums[i]] + nums[i];
        // 初始化
        dp[0] = 1;

        for(int i = 0; i < nums.size(); ++i) {
            for(int j = left; j >= nums[i]; --j) {
                dp[j] += dp[j - nums[i]];
            }
        }
        for(int val : dp) cout << val << " ";
        return dp[left];
    }
};

474.一和零

题目链接 文章讲解 视频讲解

  • dp[i][j]: 表示装满i个0和j个1最多可以装dp[i][j]个物品
  • 递推公式:dp[i][j] = max(dp[i - x][j - y], dp[i][j])
  • 初始化:均初始化为0
  • 遍历顺序:先遍历物品后遍历背包
  • 打印dp数组
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        // dp[i][j]: 装满i个0和j个1,最多装多少个
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        // 递推公式: dp[i][j] = max(dp[i - x][j - y] + 1, dp[i][j])

        // 初始化 dp[i][j] = 0
        
        // 遍历顺序,先遍历物品后遍历背包
        for(string str : strs) {
            int x = 0, y = 0;
            for(char ch : str) {
                if(ch == '0') ++x;
                else ++y;
            }

            // 遍历背包
            for(int i = m; i >= x; --i) { 
                for(int j = n; j >= y; --j) dp[i][j] = max(dp[i - x][j - y] + 1, dp[i][j]);
            }
        }
        return dp[m][n];
    }   
};

标签:stones,遍历,nums,int,随想录,II,第四十二,dp,left
From: https://www.cnblogs.com/cscpp/p/18277091

相关文章

  • Day6 四数之和II,赎金信,三数之和,四数之和
    四数之和II 在这道题中我们要做的是寻找次数,所以在这个代码中这个次数就是value因为我们是通过key来寻找value。所以为了寻找这个次数我们需要把这个我们要找的数当做值,由此我们需要根据键来寻找值!!!#include<iostream>#include<unordered_map>usingnamespacestd;#inc......
  • Day7 反转字符串,反转字符串II,替换数字
    反转字符串 #include<iostream>usingnamespacestd;#include<string>voidfanzhuan(string&s){ for(inti=0,j=s.size()-1;i<s.size()/2;i++,j--) { swap(s[i],s[j]); } cout<<s;}intmain(){ strings; cin>>s; ......
  • 代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈、20.有效的括号、 1
    今天学习了栈与队列这两个数据结构,栈是一个先进后出的结构,在C++中用stack进行表示,有push、pop、top、empty这些属性;队列是一个先进后出的结构,有push、pop、front、back。empty这些属性。在底层实现上,他们都是用deque双向队列进行实现的。232.用栈实现队列题目链接:232.用栈......
  • 代码随想录算法训练营第九天|151.翻转字符串里的单词,卡码网:55.右旋转字符串
    151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)题目要求是给定一个字符串,要求把里面的单词进行倒序输出,并且要删除里面多余的空格。我的第一种做法是把里面的字符串提取出来,然后倒序放入一个新的字符串中,这样空间复杂度会比较高,也AC了,但肯定不是最......
  • 代码随想录算法训练营第50天 | 1143.最长公共子序列 、1035.不相交的线 、53. 最大子
    这几题都挺类似,都是求最长公共子序列,有些题目稍微变了下1143.最长公共子序列体会一下本题和718.最长重复子数组的区别视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQhttps://programmercarl.com/1143.最长公共子序列.html/***@param{string}text1*@param{......
  • 力扣第213题“打家劫舍 II”
    在本篇文章中,我们将详细解读力扣第213题“打家劫舍II”。通过学习本篇文章,读者将掌握如何使用动态规划来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。问题描述力扣第213题“打家劫舍II”描述如下:你是一个专业的小偷,计......
  • leetCode.92. 反转链表 II
    leetCode.92.反转链表II题目思路代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNod......
  • 基于ucosii的车载电控单元
    一、项目简介   通过利用STM32F103C8、直流电机、按键、us015超声波测距模块、MPU6050、蜂鸣器、TFLCD、霍尔传感器等硬件设计一个车载电控单元,实现了手动加档、实时显示车速、超声波避障预警、车身倾斜预警以及更新固件功能,以保证行车安全。二、项目框架   三、......
  • 悟空派 & 香橙派驱动0.9英寸OLED(IIC)
    悟空派&香橙派驱动0.9寸OLED(IIC)前言​在linux核心板中,一般会引出许多GPIO引脚,方便开发者使用这些GPIO进行额外开发。在本文中使用IIC端口,驱动0.9寸OLED屏幕,显示远程SSH端口,以及CPU当前温度以及更多主板相关信息。1.开启IIC端口​在命令行输入:#具体文件根据自己系......
  • 代码随想录算法训练营第49天 | 300.最长递增子序列 、674. 最长连续递增序列 、718.
    300.最长递增子序列今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。视频讲解:https://www.bilibili.com/video/BV1ng411J7xPhttps://programmercarl.com/0300.最长上升子序列.html/***@param{number[]}nums*@return{number}*/varlengthOfL......