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

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

题目1049. 最后一块石头的重量 II
题目494. 目标和
题目474. 一和零

● 看到题目的第一想法

多重背包这些到底是什么鬼

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

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

都难

● 解题代码

  1. 点击查看代码
    class Solution {
    	public int lastStoneWeightII(int[] stones) {
    		int sum = 0;
    		for (int i : stones) {
    			sum += i;
    		}
    		int target = sum >> 1;
    		//初始化dp数组
    		int[] dp = new int[target + 1];
    		for (int i = 0; i < stones.length; i++) {
    			//采用倒序
    			for (int j = target; j >= stones[i]; j--) {
    				//两种情况,要么放,要么不放
    				dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
    			}
    		}
    		return sum - 2 * dp[target];
    	}
    }
    
  2. 点击查看代码
    class Solution {
    	public int findTargetSumWays(int[] nums, int target) {
    		int sum = 0;
    		for (int i = 0; i < nums.length; i++) sum += nums[i];
    		//如果target过大 sum将无法满足
    		if ( target < 0 && sum < -target) return 0;
    		if ((target + sum) % 2 != 0) return 0;
    		int size = (target + sum) / 2;
    		if(size < 0) size = -size;
    		int[] dp = new int[size + 1];
    		dp[0] = 1;
    		for (int i = 0; i < nums.length; i++) {
    			for (int j = size; j >= nums[i]; j--) {
    				dp[j] += dp[j - nums[i]];
    			}
    		}
    		return dp[size];
    	}
    }
    
  3. 点击查看代码
    class Solution {
    	public int findMaxForm(String[] strs, int m, int n) {
    		//dp[i][j]表示i个0和j个1时的最大子集
    		int[][] dp = new int[m + 1][n + 1];
    		int oneNum, zeroNum;
    		for (String str : strs) {
    			oneNum = 0;
    			zeroNum = 0;
    			for (char ch : str.toCharArray()) {
    				if (ch == '0') {
    					zeroNum++;
    				} else {
    					oneNum++;
    				}
    			}
    			//倒序遍历
    			for (int i = m; i >= zeroNum; i--) {
    				for (int j = n; j >= oneNum; j--) {
    					dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
    				}
    			}
    		}
    		return dp[m][n];
    	}
    }
    

● 今日收获,学习时长

今日收获:日后再补!
学习时长:1.5h
posted @ 2024-01-10 11:45  雨年今天有记录吗  阅读(1)  评论(0)    收藏  举报