• 动态规划-----分隔等和数组


    /***
     * 问题:分割等和子集
     * 解决方法:动态规划、递归法:
     * 1、建立状态
     * 2、状态转移方程
     * 第一步、先求出和,判断其是否可以被2整除
     * 第二步、for循环的确定dp
     * 递归法:时间会超时,函数的调度太大
     * 动态规划:相当于背包的问题
     * 在数组中找到一些数值去填充target
     * 从而可以确定状态boolean dp[i]表示target为i时用数组中的元素是否可以被填满
     * 进一步的确定状态转移方程dp[j]=dp[j-i];表示如果dp[j-i]可以被填满则dp[j]也可以被填满
     * java:
     * class Solution {
        private int target=0;
        public boolean canPartition(int[] nums) {
            for(int i=0;i<nums.length;++i)
                target+=nums[i];
            if(target%2!=0)return false;
            target=target>>1;
            return dfs(nums,0,target);
        }
        public boolean dfs(int[] nums,int index,int target)
        {
            if(target==0)return true;
            else if(target<0)return false;
            for(int i=index;i<nums.length;++i)
                if(dfs(nums,i+1,target-nums[index]))return true;
            return false;
        }
    }
     * c++:
     * class Solution {
    private:
        int sum=0;
        int target=0;
    public:
        bool dfs(vector<int>& nums,int index,int target)
        {
            if(target==0)return true;
            else if(target<0)return false;
            for(int i=index;i<nums.size();++i)
                if(dfs(nums,i+1,target-nums[index]))return true;
            return false;
        }
    
    public:
        bool canPartition(vector<int>& nums) {
            for(int i=0;i<nums.size();++i)
                sum+=nums[i];
            if(sum%2!=0)return false;
            target=sum>>1;
            return dfs(nums,0,target);
        }
    };
    *动态规划:
    * class Solution {
    private:
        int target=0;
        vector<bool>dp;
    public:
        bool canPartition(vector<int>& nums) {
            for(int i=0;i<nums.size();++i)
                target+=nums[i];
            if(target%2!=0)return false;
            target=target>>1;
            dp=vector<bool>(target+1,false);
            for(int i=0;i<nums.size();++i)
                for(int j=target;j>=nums[i];--j)
                {
                    if(j==nums[i])dp[j]=true;
                    else if(dp[j]==false)
                        dp[j]=dp[j-nums[i]];
                }
            return dp[target];
        }
    };
    */
  • 相关阅读:
    交换机/路由器上的 S口 F口 E口
    对称加密&非对称加密
    字节流和字符流 in Java
    Python中使用MySQL
    完全二叉树、理想二叉树满二叉树
    优化MySchool数据库设计
    关于SQL储存过程中输出多行数据
    关于本月第一天,本月最后一天的SQL代码
    SQL常见的系统存储过程
    相关子查询【SQL Server】
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11755360.html
Copyright © 2020-2023  润新知