Java 题解 | #农场的奶牛分组#
农场的奶牛分组
https://www.nowcoder.com/practice/bdb90a97a15d42f989e406080d88bed9
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weights int整型一维数组 * @return bool布尔型 */ public boolean canPartition (int[] weights) { // write code here int sum = 0; for (int weight : weights) { sum += weight; } if ((sum & 1) == 1) { return false; } sum >>= 1; boolean[] f = new boolean[sum + 1]; f[0] = true; for (int weight : weights) { for (int j = sum; j >= weight; j--) { f[j] = f[j] || f[j - weight]; } } return f[sum]; } }
编程语言是Java
考察的知识点为动态规划
代码解释:计算数组中所有元素的和,如果和为奇数,则无法平分为两个相等的子集,直接返回 false。然后,将总和除以 2,目标是在数组中找到一个子集的和等于这个值。使用一个布尔数组 f
来记录当前和能否由数组中的一部分元素组成,初始化只有 f[0]
为 true。然后,遍历数组中的每个元素,从后往前更新布尔数组,如果当前和可以由之前的元素和组成,或者加入当前元素后能够达到当前和,就将对应的 f
值设置为 true。最后,返回布尔数组的 f[sum]
位置即可判断是否可以平分为两个子集。