题解 | #农场的奶牛分组II# dp解法

农场的奶牛分组II

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

知识点

动态规划

思路

首先我们定义f[i][j][k]为前i个数,能否组成j, k, s - j - k 三个部分。

其中s是前i个数的前缀和。

这样我们根据当前的数w分在哪一个部分,可以由f[i-1][j-w][k]、f[i-1][j][k-w]、f[i-1][j][k]三部分传递过来。

因此假设假设总和为m,时间复杂度为O(nm^2)

其中空间可以优化掉第一维。空间复杂度为O(m^2)

n是200,每个数最大为100,因此总和m \leq 7e^3,空间开O(m^2)级别也在5e^7左右,由于vector<bool>的每一位是1个bit,所以空间是正常的八分之一,空间不会超过6MB

但是考虑计算时间约在1e^{10} 妥妥超时,但是没想到更好的办法。但是肯定比回溯的时间复杂度要低。

AC Code (C++) 空间二维优化版本

#include <numeric>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param weights int整型vector 
     * @return bool布尔型
     */
    bool canPartitionII(vector<int>& weights) {
        int sum = accumulate(weights.begin(), weights.end(), 0);
        if (sum % 3) return false;
        sum /= 3;
        int s = 0;
        int n = weights.size();
        vector<vector<bool>> f(sum + 1, vector<bool>(sum + 1));
        // f[i][j][k] 前i个数 能否组成j, k, s - j - k 三个部分
        f[0][0] = true;
        for (int i = 0; i < n; i ++) {
            s += weights[i];
            for (int j = sum; j >= 0; j --) {
                for (int k = sum; k >= 0; k --) {
                    if (s - j - k > sum) f[j][k] = false;
                    if (j >= weights[i]) f[j][k] = (f[j][k] or f[j-weights[i]][k]);
                    if (k >= weights[i]) f[j][k] = (f[j][k] or f[j][k-weights[i]]);
                }
            }
        }
        return f[sum][sum];
    }
};

全部评论

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务