代码随想录算法训练营第四十二天 | 分割等和子集

● 今日学习的文章链接和视频链接

题目416. 分割等和子集

● 看到题目的第一想法

难!背包!

● 看完代码随想录之后的想法

难!背包!

● 实现过程中遇到哪些困难

寒假要好好补背包问题

● 解题代码

  1. 点击查看代码
    class Solution {
    	public boolean canPartition(int[] nums) {
    		if(nums == null || nums.length == 0) return false;
    		int n = nums.length;
    		int sum = 0;
    		for(int num : nums) {
    			sum += num;
    		}
    		//总和为奇数,不能平分
    		if(sum % 2 != 0) return false;
    		int target = sum / 2;
    		int[] dp = new int[target + 1];
    		for(int i = 0; i < n; i++) {
    			for(int j = target; j >= nums[i]; j--) {
    				//物品 i 的重量是 nums[i],其价值也是 nums[i]
    				dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
    			}
    
    			//剪枝一下,每一次完成內層的for-loop,立即檢查是否dp[target] == target,優化時間複雜度(26ms -> 20ms)
    			if(dp[target] == target)
    				return true;
    		}
    		return dp[target] == target;
    	}
    }
    

● 今日收获,学习时长

今日收获:且学且珍惜
学习时长:1h
posted @ 2024-01-09 12:11  雨年今天有记录吗  阅读(0)  评论(0)    收藏  举报