2022-1-30动态规划day6

题1:

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

 

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

 

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100
 1 class Solution {
 2     public boolean canPartition(int[] nums) {
 3         int n=nums.length;
 4         int sum=0;
 5         for (int x:nums) sum+=x;
 6         if (sum%2!=0) return false;
 7         boolean[][] dp=new boolean[n+1][sum/2+1];
 8         // dp[i][j] 用i个数组成j的可行性
 9         // dp[i][j] 用第i个 dp[i][j-nums[i]] 不用 dp[i-1][j]
10         // dp[i][0]=true;
11         for (int i=0;i<=n;i++) dp[i][0]=true;
12         for (int i=0;i<=sum/2;i++) dp[0][i]=false;
13         for (int i=1;i<=n;i++){
14             for (int j=1;j<=sum/2;j++) {
15                 if (j>=nums[i-1]) dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i-1]];
16                 else dp[i][j]=dp[i-1][j];
17             }
18         }
19         return dp[n][sum/2];
20     }
21 }

思路:首先累加和,看sum是否为2的倍数,要满足条件sum必须要2的倍数。定义dp[i][j],转化为用i个数字组成j的可行性,题目转化为用nums组成sum的一半。

posted on 2022-01-30 20:59  阿ming  阅读(19)  评论(0编辑  收藏  举报

导航