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

leetcode416. 分割等和子集(動態(tài)規(guī)劃-java)

這篇具有很好參考價值的文章主要介紹了leetcode416. 分割等和子集(動態(tài)規(guī)劃-java)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

leetcode416. 分割等和子集

來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/partition-equal-subset-sum

題目描述

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

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

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

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

暴力遞歸

動態(tài)規(guī)劃其實是對暴力遞歸的改寫,當(dāng)你對動態(tài)規(guī)劃沒有思路時,要先寫出暴力遞歸的嘗試,
這道題是典型的 0 -1 背包問題,就是要組成目標(biāo)和,那我們每到一個位置,都是面臨兩個選擇,選或者不選.分別對兩種情況進(jìn)行遞歸,最后比較兩種遞歸的情況就可以得到答案了.
還要注意找到base case ,我們代碼里注釋說明

代碼演示

    public boolean canPartition(int[] nums) {
        if(nums.length == 1){
            return false;
        }
        //計算數(shù)組累加和
       int sum = 0;
       for(int i = 0 ; i < nums.length;i++){
            sum += nums[i];
       }
       //如果不是偶數(shù)沒有辦法拆分成兩個數(shù)組和相等
         if(sum % 2 != 0){
             return false;
         }
         //能找到拆分方式的數(shù)量如果不等于0 ,就是可以拆分
         return process(nums,sum / 2,0) != 0;
     
    }

    /**
     * 暴力遞歸
     * 計算有多少種拆分方式
     * target 要組成的目標(biāo)數(shù)字
     * index 來到的下標(biāo)位置
     */
    public int process(int[]nums,int target,int index){
        //base case 如果來到越界位置,target == 0,前面選擇有效,返回1,代表一種有效方案
        if(index == nums.length){
            return target == 0 ? 1 : 0;
        }
        //target < 0 說明前面的選擇是無效的,返回 0
        if(target < 0){
            return 0;
        }
        // target == 0 ,前面選擇是合法的,返回1.
        if(target == 0){
            return 1;
        }
        //經(jīng)典背包解法,選和不選兩種情況 
        //不選時 去 index + 1 位置繼續(xù)做選擇
        int p1 = process(nums,target,index + 1);
        //選時 去 index + 1 位置繼續(xù)做選擇,需要組成的數(shù)字還剩target - nums[index]
        int p2 = process(nums,target - nums[index],index + 1);
        //返回最多的方法數(shù)
        return Math.max(p1,p2);

    }

動態(tài)規(guī)劃

解題思路

動態(tài)規(guī)劃是對暴力遞歸的改寫,三個步驟,
1.根據(jù)base case 初始化dp表
2.遞歸過程改成從dp 表種拿值得過程
3.返回遞歸調(diào)用得最初始狀態(tài),
具體這個問題種,位置如何依賴,如何拿值呢,我用圖演示下.
leetcode416. 分割等和子集(動態(tài)規(guī)劃-java)橫著得方向是target,豎得方向是index,(演示需要認(rèn)為數(shù)組長度是7,)
首先看,根據(jù)base case ,target == 0 時,返回1,所以dp 表種,target = 0 位置,全部初始化為1.
base case 里index 越界時,target = 0 時是1,其余是0,因為java語言本身數(shù)組初始化時,元素都是0,所以只需要初始化1出來就好了.
再看一般位置如何求解,以x位置為例.在遞歸中;
int p1 = process(nums,target,index + 1);
//選時 去 index + 1 位置繼續(xù)做選擇,需要組成的數(shù)字還剩target - nums[index]
int p2 = process(nums,target - nums[index],index + 1);
看到,x 依賴,index + 1 位置,正下方(i+ 1,target)的位置,和(target - nums[index],index + 1)這兩個位置以五角星位置參考,

  >  所以得出狀態(tài)轉(zhuǎn)移方程:
   dp[i][j] = Math.max(dp[i + 1][j] ,dp[i + 1][target - nums[index]]);

代碼演示

    /**
     * 動態(tài)規(guī)劃
     * @param nums
     * @return
     */
    public boolean dp(int[] nums){
        int sum = 0;
        for(int i = 0 ; i < nums.length;i++){
            sum += nums[i];
        }
        if(sum % 2 != 0){
            return false;
        }
        int N  = nums.length;
        int target = sum / 2;
        //動態(tài)規(guī)劃表
        int[][]dp = new int[N+1][target+ 1];
        //初始化 target == 0 時的位置為1.
        for (int i = 0; i <= N ; i++){
            dp[i][0] = 1;
        }
        for(int i = N - 1;i >= 0;i--){
            for (int j = 0; j <= target;j++){
                int p1 = dp[i + 1][j];
                int p2 = 0;
                //判斷位置不能越界
                if(j - nums[i] >= 0){
                    p2 = dp[i+1][j - nums[i] ];
                }
                //狀態(tài)轉(zhuǎn)移方程
                dp[i][j] = Math.max(p1,p2);
            }
        }

        return dp[0][target] != 0;

    }

動態(tài)規(guī)劃專題

leetcode.486. 預(yù)測贏家,動態(tài)規(guī)劃

leetcode354. 俄羅斯套娃信封問題

leetcode688. 騎士在棋盤上的概率

leetcode300. 最長遞增子序列

填滿背包的最大價格

-數(shù)字轉(zhuǎn)字符串,有多少種轉(zhuǎn)化結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-502525.html

到了這里,關(guān)于leetcode416. 分割等和子集(動態(tài)規(guī)劃-java)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

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

    2024年02月03日
    瀏覽(26)
  • 力扣:416. 分割等和子集 & 1049. 最后一塊石頭的重量 II (動態(tài)規(guī)劃)(二合一,一次吃透兩道題)

    力扣:416. 分割等和子集 & 1049. 最后一塊石頭的重量 II (動態(tài)規(guī)劃)(二合一,一次吃透兩道題)

    力扣:416. 分割等和子集 1049. 最后一塊石頭的重量 II 用的方法都是01背包解法,思路也是近乎一樣,這里就放在一起講解了(主要講解第一題,第二題大家可以直接自己AC)。01背包解法詳細(xì)講解請見上篇博客01背包問題(二) 給你一個 只包含正整數(shù) 的 非空 數(shù)組 nums 。請你判斷

    2024年01月20日
    瀏覽(22)
  • LeetCode416. 分割等和子集

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

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

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

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

    Leetcode 416 分割等和子集

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

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

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

    ● 01背包問題,你該了解這些! ● 01背包問題,你該了解這些! 滾動數(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)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】416、LeetCode分割等和子集

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

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

    2024年01月19日
    瀏覽(30)
  • 【LeetCode動態(tài)規(guī)劃#06】分割等和子集(01背包問題一維寫法實戰(zhàn))

    分割等和子集 給你一個 只包含正整數(shù) 的 非空 數(shù)組 nums 。請你判斷是否可以將這個數(shù)組分割成兩個子集,使得兩個子集的元素和相等。 示例 1: 輸入:nums = [1,5,11,5] 輸出:true 解釋:數(shù)組可以分割成 [1, 5, 5] 和 [11] 示例 2: 輸入:nums = [1,2,3,5] 輸出:false 解釋:數(shù)組不能分割

    2023年04月09日
    瀏覽(121)
  • 01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集

    01背包問題-遞推公式的自我理解與LeetCode 416. 分割等和子集

    學(xué)算法好痛苦,完全是對我智力的一次次折磨,看了好多博客,對二維dp數(shù)組的理解都是直接搬了代碼隨想錄,搬了隨想錄又沒詳細(xì)解釋,大家都是一眼看懂的嗎,好吧() 如果有一個容量為 j 的這樣的背包——一個獨立的,容量為j的背包。(沒把它理解為“剩余容量”) 對于

    2024年02月07日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包