题解 | #农场的奶牛分组#
农场的奶牛分组
https://www.nowcoder.com/practice/bdb90a97a15d42f989e406080d88bed9
知识点:动态规划
思路:
- 首先计算数组weights的总和sum,使用Arrays.stream方法对数组元素求和。
- 如果sum为奇数,则无法分割成两个相等的子集,直接返回false。
- 将sum除以2,得到目标子集的和,即sum/2。
- 创建一个长度为sum+1的布尔数组f,用于记录能否得到和为j的子集。
- 初始化f[0]为true,表示可以得到和为0的子集(即不选取任何元素)。
- 遍历数组weights的每个元素x。
- 从sum向下遍历到x,更新f[j]为f[j]或f[j - x]。f[j]表示能否得到和为j的子集,f[j - x]表示能否得到和为j-x的子集并选取元素x。
- 循环结束后,f[sum]即为是否能得到和为sum的子集。
- 返回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]; } }