国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【力扣】416. 分割等和子集 <動(dòng)態(tài)規(guī)劃、回溯>

這篇具有很好參考價(jià)值的文章主要介紹了【力扣】416. 分割等和子集 <動(dòng)態(tài)規(guī)劃、回溯>。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【力扣】416. 分割等和子集

給你一個(gè) 只包含正整數(shù)的非空數(shù)組 nums 。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。

示例 1:
輸入:nums = [1,5,11,5]
輸出:true
解釋:數(shù)組可以分割成 [1, 5, 5] 和 [11] 。

示例 2:
輸入:nums = [1,2,3,5]
輸出:false
解釋:數(shù)組不能分割成兩個(gè)元素和相等的子集。

提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100

題解

動(dòng)態(tài)規(guī)劃

01背包問(wèn)題:有 N 件物品和一個(gè)最多能背重量為 W 的背包。第 i 件物品的重量是weight[i],得到的價(jià)值是value[i] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價(jià)值總和最大。

  • 背包的體積為sum / 2
  • 背包要放入的商品(集合里的元素)重量為元素的數(shù)值,價(jià)值也為元素的數(shù)值
  • 背包如果正好裝滿,說(shuō)明找到了總和為 sum / 2 的子集
  • 背包中每一個(gè)元素是不可重復(fù)放入

回溯五步:

  • 確定dp數(shù)組以及下標(biāo)的含義
    01背包中,dp[j] 表示: 容量為 j 的背包,所背的物品價(jià)值最大可以為 dp[j]
    本題中每一個(gè)元素的數(shù)值既是重量,也是價(jià)值。
    dp[j] 表示背包總?cè)萘浚ㄋ苎b的總重量)是 j,放進(jìn)物品后,背的最大重量為 dp[j]
    如果背包容量為 target, dp[target] 就是裝滿背包之后的重量,所以 當(dāng) dp[target] == target 的時(shí)候,背包就裝滿了。
  • 確定遞推公式
    01背包的遞推公式為:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    背包里放入數(shù)值,那么物品 i 的重量是 nums[i],其價(jià)值也是 nums[i]。
    所以遞推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
  • dp數(shù)組如何初始化
    dp[j] 的定義來(lái)看,首先dp[0]一定是0,如果題目給的價(jià)值都是正整數(shù)那么非0下標(biāo)都初始化為0就可以了,如果題目給的價(jià)值有負(fù)數(shù),那么非0下標(biāo)就要初始化為負(fù)無(wú)窮。
  • 確定遍歷順序
    如果使用一維 dp數(shù)組,物品遍歷的 for 循環(huán)放在外層,遍歷背包的for循環(huán)放在內(nèi)層,且內(nèi)層 for 循環(huán)倒序遍歷。
  • 舉例推導(dǎo)dp數(shù)組
    dp[j] == j 說(shuō)明,集合中的子集總和正好可以湊成總和 j
    【力扣】416. 分割等和子集 <動(dòng)態(tài)規(guī)劃、回溯>,力扣及OJ,# 動(dòng)態(tài)規(guī)劃,leetcode,動(dòng)態(tài)規(guī)劃,算法
class B {
    public boolean canPartition(int[] nums) {
        if(nums == null || nums.length == 0) {
            return false;
        }
        int sum = 0;
        for(int num : nums) {
            sum += num;
        }
        //總和為奇數(shù),不能平分
        if(sum % 2 != 0) {
            return false;
        }
        
        int target = sum / 2;
        int[] dp = new int[target + 1];
        
        for(int i = 0; i < nums.length; i++) {
            for(int j = target; j >= nums[i]; j--) {
                //物品 i 的重量是 nums[i],其價(jià)值也是 nums[i]
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }
            //剪枝一下,每一次完成內(nèi)層的for-loop,立即檢查是否dp[target] == target,優(yōu)化時(shí)間復(fù)雜度(26ms -> 20ms)
            if(dp[target] == target)
                return true;
        }
        return dp[target] == target;
    }
}

回溯(會(huì)超時(shí))

取與不取文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692026.html

class B {
    public static void main(String[] args) {
        B b = new B();
        int[] nums = {1,5,11,5};//true
//        int[] nums = {1,2,3,5};//false
        System.out.println(b.canPartition(nums));
    }

    // 回溯
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();

    public boolean canPartition(int[] nums) {
        int target = 0;
        for (int i = 0; i < nums.length; i++) {
            target += nums[i];
        }
        if (target % 2 != 0) {
            return false;
        }

        target = target / 2;
        //Arrays.sort(nums);
        trace(nums, 0, target, 0);

        if (res.size() > 0) {
            // System.out.println(res);
            return true;
        } else {
            return false;
        }
    }

    public void trace(int[] nums, int start, int target, int sum) {
        if (sum == target) {
            res.add(new ArrayList<>(path));
            return;
        }
        if (sum > target) {
            return;
        }
        for (int i = start; i < nums.length; i++) {
            path.add(nums[i]);
            sum += nums[i];
            trace(nums, i + 1, target, sum);
            sum -= nums[i];
            path.remove(path.size() - 1);
        }
    }
}

到了這里,關(guān)于【力扣】416. 分割等和子集 <動(dòng)態(tài)規(guī)劃、回溯>的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問(wèn)題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問(wèn)題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    其他背包,面試幾乎不會(huì)問(wèn),都是競(jìng)賽級(jí)別的了,leetcode上連多重背包的題目都沒有,所以題庫(kù)也告訴我們,01背包和完全背包就夠用了。 而完全背包又是也是01背包稍作變化而來(lái),即:完全背包的物品數(shù)量是無(wú)限的。 01 背包問(wèn)題描述 有n件物品和一個(gè)最多能背重量為w 的背包

    2024年04月25日
    瀏覽(17)
  • 【十七】【動(dòng)態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    【十七】【動(dòng)態(tài)規(guī)劃】DP41 【模板】01背包、416. 分割等和子集、494. 目標(biāo)和,三道題目深度解析

    動(dòng)態(tài)規(guī)劃就像是解決問(wèn)題的一種策略,它可以幫助我們更高效地找到問(wèn)題的解決方案。這個(gè)策略的核心思想就是將問(wèn)題分解為一系列的小問(wèn)題,并將每個(gè)小問(wèn)題的解保存起來(lái)。這樣,當(dāng)我們需要解決原始問(wèn)題的時(shí)候,我們就可以直接利用已經(jīng)計(jì)算好的小問(wèn)題的解,而不需要重

    2024年02月03日
    瀏覽(26)
  • 代碼隨想錄 Day35 動(dòng)態(tài)規(guī)劃04 01背包問(wèn)題和完全背包問(wèn)題 LeetCode T416 分割等和子集

    代碼隨想錄 Day35 動(dòng)態(tài)規(guī)劃04 01背包問(wèn)題和完全背包問(wèn)題 LeetCode T416 分割等和子集

    說(shuō)到背包問(wèn)題大家都會(huì)想到使用動(dòng)規(guī)的方式來(lái)求解,那么為什么用動(dòng)規(guī)呢, dp數(shù)組代表什么呢 ? 初始化是什么 , 遍歷方式又是什么 ,這篇文章筆者將詳細(xì)講解背包問(wèn)題的經(jīng)典例題0-1背包問(wèn)題和完全背包問(wèn)題的解題方式,希望能幫助到大家 有人一提到背包問(wèn)題就只會(huì)使用動(dòng)態(tài)規(guī)劃來(lái)

    2024年02月06日
    瀏覽(124)
  • 第九章 動(dòng)態(tài)規(guī)劃part04(● 01背包問(wèn)題,你該了解這些! ● 01背包問(wèn)題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 )

    第九章 動(dòng)態(tài)規(guī)劃part04(● 01背包問(wèn)題,你該了解這些! ● 01背包問(wèn)題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 )

    ● 01背包問(wèn)題,你該了解這些! ● 01背包問(wèn)題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 視頻講解:https://www.bilibili.com/video/BV1cg411g7Y6 1.確定dp數(shù)組以及下標(biāo)的含義 i是物品,j是背包容量

    2024年01月16日
    瀏覽(25)
  • 力扣算法刷題Day42|動(dòng)態(tài)規(guī)劃:01背包問(wèn)題 分割等和子集

    力扣題目:01背包問(wèn)題(二維數(shù)組) 刷題時(shí)長(zhǎng):參考題解 解題方法:動(dòng)態(tài)規(guī)劃 +?二維dp數(shù)組 復(fù)雜度分析 時(shí)間 空間 問(wèn)題總結(jié) 理解遞推公式困難 本題收獲 動(dòng)規(guī)思路:兩層for循環(huán),第一層i遍歷物品,第二層j枚舉背包容量以內(nèi)所有值 確定dp數(shù)組及下標(biāo)的含義:dp[i][j] 表示從下標(biāo)

    2024年02月13日
    瀏覽(94)
  • 動(dòng)態(tài)規(guī)劃(分割等和子集)

    動(dòng)態(tài)規(guī)劃(分割等和子集)

    題目難易:中等 給定一個(gè)只包含正整數(shù)的非空數(shù)組。是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 注意: 每個(gè)數(shù)組中的元素不會(huì)超過(guò) 100 數(shù)組的大小不會(huì)超過(guò) 200 示例 1: 輸入: [1, 5, 11, 5] 輸出: true 解釋: 數(shù)組可以分割成 [1, 5, 5] 和 [11]. 示例 2: 輸入: [1, 2

    2024年02月02日
    瀏覽(24)
  • LeetCode416. 分割等和子集

    一、題目 給你一個(gè) 只包含正整數(shù) 的 非空 數(shù)組 nums 。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 示例 1: 示例 2: 提示: 1 = nums.length = 200 1 = nums[i] = 100 二、題解 方法一:0-1背包二維數(shù)組 步驟1:理解題目以及01 背包問(wèn)題 在 01 背包問(wèn)題中,

    2024年02月10日
    瀏覽(26)
  • 【LeetCode】416.分割等和子集

    給你一個(gè)? 只包含正整數(shù)? 的? 非空? 數(shù)組? nums ?。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 示例 1: 示例 2: 提示: 1 = nums.length = 200 1 = nums[i] = 100 實(shí)際上是求能否從背包里選取元素,使這些元素之和等于數(shù)組所有元素之和的一半。dp

    2024年02月11日
    瀏覽(27)
  • Leetcode 416 分割等和子集

    Leetcode 416 分割等和子集

    題意理解 : ????????給你一個(gè)? 只包含正整數(shù)? 的? 非空? 數(shù)組? nums ?。請(qǐng)你判斷是否可以將這個(gè)數(shù)組分割成兩個(gè)子集,使得兩個(gè)子集的元素和相等。 ? ? ? ? 即將數(shù)組的元素分成兩組,每組數(shù)值=sum(nums)/2 ? ? ? ? 若能分成這樣的兩組,則返回true,否則返回false ? ? ?

    2024年02月01日
    瀏覽(19)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】416、LeetCode分割等和子集

    【算法與數(shù)據(jù)結(jié)構(gòu)】416、LeetCode分割等和子集

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :本題可以抽象成一個(gè)01背包的問(wèn)題,關(guān)于01背包可以看【算法與數(shù)據(jù)結(jié)構(gòu)】算法與數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)。 本題只需要求出數(shù)組的累積和,然后和的一半就可以視為背包的最大重量,目標(biāo)

    2024年01月19日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包