• 动态规划(0-1背包)---划分数组为和相等的两部分


    划分数组为和相等的两部分

    416. Partition Equal Subset Sum (Medium)

    题目描述:

      给定一个数组,判断其是否可以被划分为相等的两部分。

    思路分析:

      我们可以换一种思路,判断其是否可以分为相等的两部分,其实就是看是否能在数组中挑选出和为数组和一半的序列。那么就可以转化为背包问题,在N个数中挑选数字使其和为数组和的一半,状态转移方程为:

      dp[i]=dp[i] || dp[i-num]

    代码:

    public boolean canPartition(int []nums){
        int sum=0;
        for(int num:nums){
            sum=sum+num;
        }
        if(sum%2!=0)
            return false;
        int target=sum/2;
        boolean []dp=new boolean [target+1];
        dp[0]=true;
        for(int num:nums){ //0-1背包一个物品只能用一次
            for(int i=target;i>=num;i--){ //从后向前,先计算dp[i],再计算dp[i-num]
                dp[i]=dp[i]||dp[i-num];
            }
        }
        return dp[target];
    }
    
  • 相关阅读:
    do-while语句
    指针操作符
    字符译码
    PHP流程控制分支结构
    PHP数据类型和常量
    PHP中使用的变量
    第一个PHP程序
    HTML的区块属性
    HTML的定位属性
    HTML的盒子模型
  • 原文地址:https://www.cnblogs.com/yjxyy/p/11119379.html
Copyright © 2020-2023  润新知