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

农场的奶牛分组

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];
    }
}

全部评论
dp[i][target] = true;怎么有这句
点赞 回复 分享
发布于 2023-08-08 19:19 浙江

相关推荐

虚闻松声:继续投吧。 简历没啥问题。很优秀。 拙见:自我评价没什么意义;试试转向Agent开发、大模型应用;别死磕传统Java开发。 免费修改简历,就业咨询,欢迎私信交流。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务