题解 | #农场的奶牛分组#

农场的奶牛分组

https://www.nowcoder.com/practice/bdb90a97a15d42f989e406080d88bed9

知识点:动态规划

思路:

  1. 首先计算数组weights的总和sum,使用Arrays.stream方法对数组元素求和。
  2. 如果sum为奇数,则无法分割成两个相等的子集,直接返回false。
  3. 将sum除以2,得到目标子集的和,即sum/2。
  4. 创建一个长度为sum+1的布尔数组f,用于记录能否得到和为j的子集。
  5. 初始化f[0]为true,表示可以得到和为0的子集(即不选取任何元素)。
  6. 遍历数组weights的每个元素x。
  7. 从sum向下遍历到x,更新f[j]为f[j]或f[j - x]。f[j]表示能否得到和为j的子集,f[j - x]表示能否得到和为j-x的子集并选取元素x。
  8. 循环结束后,f[sum]即为是否能得到和为sum的子集。
  9. 返回f[sum]作为结果。

编程语言:java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param weights int整型一维数组
     * @return bool布尔型
     */
    public boolean canPartition(int[] weights) {
        int sum = Arrays.stream(weights).sum();
        if (sum % 2 != 0) return false;
        sum /= 2;
        boolean[] f = new boolean[sum + 1];
        f[0] = true;

        for (int x : weights) {
            for (int j = sum; j >= x; j--) {
                f[j] = f[j] || f[j - x];
            }
        }
        return f[sum];
    }
}

全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务