力扣刷题记录(17)LeetCode:416、1049

416. 分割等和子集

可以将该问题看成是一个背包问题。背包的容量就是nums数组和的一半。我们如果能够将背包装满就意味着可以将数组分割成两个元素和相等的子集。 

1.确定dp[i]的含义

        索引i表示背包的容量,dp[i]表示当前容量能够装载的最大值

2.确定动态转移方程

        对于nums的各个元素我们有取和不取两种选择,我们取这两种方案中较大的值

        dp[i]=max(dp[j],dp[ j-nums[i] ]+nums[i] );

3.确定遍历方式

        先正序遍历nums数值,再倒序遍历背包容量。这里为什么要倒序遍历背包容量?因为如果正序遍历可能会出现重复取值的情况,而在本题nums中的每个值只能取一次。

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        if(nums.size()==1)  return false;
        int sum=0;
        for(int i=0;i<nums.size();i++)
        {
            sum+=nums[i];
        }
        if(sum%2==1)    return false;
        int back=sum/2; //背包容量
        vector<int> dp(10000+1,0);
        
        for(int i=0;i<nums.size();i++)
        {
            for(int j=back;j>=nums[i];j--)
            {
                dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
            }
        }
        if(dp[back]==back)  return true;
        return false;
    }
};

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

这题和上题类似,要把题目转换成背包问题。可以把石头尽可能地分成两等份,这样可以使两份石头相撞时等到最小的石头。这样的话问题就变成了01背包问题,背包的容量为总石头的一半。需要注意的是在遍历背包容积时还是要采用倒序遍历,目的是每个避免重复取某一块石头。

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum=0;
        for(int i=0;i<stones.size();i++)
        {
            sum+=stones[i];
        }
        int pack=sum/2;
        vector<int> dp(pack+1,0);
        for(int i=0;i<stones.size();i++)
        {
            //进入for循环的条件是背包剩余容量要大于石头体积
            for(int j=pack;j>=stones[i];j--)
            {
                dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return sum-2*dp[pack];
    }
};

相关推荐

  1. 代码随想录记录7——206,24,19

    2023-12-21 06:08:02       32 阅读
  2. 记录:46_全排列(中)

    2023-12-21 06:08:02       58 阅读
  3. 2024.3.25(1200-1400)记录

    2023-12-21 06:08:02       34 阅读
  4. 2024.3.27(1200-1400)记录

    2023-12-21 06:08:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-21 06:08:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-21 06:08:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-21 06:08:02       82 阅读
  4. Python语言-面向对象

    2023-12-21 06:08:02       91 阅读

热门阅读

  1. nlohmann json:json中的回车换行符\n\r

    2023-12-21 06:08:02       59 阅读
  2. Mysql索引&&事务(面试高频)

    2023-12-21 06:08:02       66 阅读
  3. 26. 删除有序数组中的重复项

    2023-12-21 06:08:02       74 阅读
  4. Python自适应调整Excel的列宽度

    2023-12-21 06:08:02       68 阅读
  5. Python控制Excel自动刷新页面

    2023-12-21 06:08:02       50 阅读
  6. 怎么防护服务器不被入侵

    2023-12-21 06:08:02       49 阅读
  7. MVC框架和Spring MVC的基本流程

    2023-12-21 06:08:02       58 阅读
  8. 华为云Stack 8.X 流量模型分析(一)

    2023-12-21 06:08:02       53 阅读
  9. 解决 MATLAB 启动速度慢的问题

    2023-12-21 06:08:02       97 阅读