题解 | #农场的奶牛分组#
农场的奶牛分组
https://www.nowcoder.com/practice/bdb90a97a15d42f989e406080d88bed9
知识点:动态规划
对于动态规划类的题目,最关键的一步是找到状态转移方程,如何由前一状态转换为下一状态,题目要求找出元素和相同的两部分,也就是要找到一个和为总和一半的子序列。我们可以定义dp[i][j],代表前i个元素是否能组成和为j的子序列,对于当前状态<i, j>来说,可以由上一状态转换而来,若dp[i - 1][j] == true,则当前状态下dp[i][j]=true,或者说dp[i - 1][j - nums[i]] == ture,也就是加上当前位置的元素后,也可以组成和为j,即dp[i][j]=true。最终状态dp[n][sum/2]即为答案。
Java题解如下
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weights int整型一维数组 * @return bool布尔型 */ public boolean canPartition (int[] weights) { // write code here int n = weights.length; int sum = Arrays.stream(weights).sum(); if(sum % 2 != 0) { return false; } int target = sum / 2; boolean[][] dp = new boolean[n + 1][target + 1]; for(int i = 0; i <= n; i++) { dp[i][0] = true; } for(int i = 1; i <= n; i++) { for(int j = 1; j <= target; j++) { dp[i][j] = dp[i - 1][j]; if(j >= weights[i - 1]) { dp[i][j] = dp[i][j] || dp[i - 1][j - weights[i - 1]]; } } } return dp[n][target]; } }