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

农场的奶牛分组

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

知识点

动态规划

解题思路

使用二维数组dp保存状态,dp[i][j] 表示前i个奶牛的体重能否凑成j,先初始化dp[i][0] 为true,即前i个奶牛的体重能够凑成 0。然后,使用两层循环进行状态转移,当当前奶牛的体重大于j时,不能选择当前奶牛,继承上一行的状态dp[i-1][j];否则,可以选择当前奶牛或不选择当前奶牛,继承两种状态中的一个。最后返回dp[n][target] 的结果,即前n个奶牛的体重能否凑成目标体重target。

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 = 0;
        for (int weight : weights) {
            sum += weight;
        }
        if (sum % 2 != 0) {
            return false;
        }

        int target = sum / 2;

        // dp[i][j] 表示前 i 个奶牛的体重能否凑成 j
        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++) {
                // 如果当前奶牛的体重大于 j,则不能选择当前奶牛
                if (weights[i - 1] > j) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    // 否则,可以选择当前奶牛或不选择当前奶牛
                    dp[i][j] = dp[i - 1][j] || dp[i - 1][j - weights[i - 1]];
                }
            }
        }

        return dp[n][target];
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:11
点赞 评论 收藏
分享
Lorn的意义:你这种岗位在中国现在要么牛马天天加班,要么关系户进去好吃好喝,8年时间,真的天翻地覆了,对于资本来说你就说一头体力更好的牛马,哎,退伍没有包分配你真的亏了。
点赞 评论 收藏
分享
07-09 12:12
门头沟学院 Java
5月底投简历7月初开奖收获秋招第一个offer,虽然白菜价,但至少能保底了
土木转行ing:土木博士想转图像,最后拿了 tp 提前批 sp 最低档,感觉性价比不高
TP-LINK开奖132人在聊
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务