1. 程式人生 > 資訊 >Python 3.9.0 穩定版釋出

Python 3.9.0 穩定版釋出

希望用一種規律搞定揹包問題

解題思路

常見的揹包問題有1、組合問題。2、True、False問題。3、最大最小問題。

以下題目整理來自大神CyC,github地址:

[github](https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode 題解 - 動態規劃.md#0-1-揹包)

我在大神整理的基礎上,又做了細分的整理。分為三類。
1、組合問題:
377. 組合總和 Ⅳ
494. 目標和
518. 零錢兌換 II
2、True、False問題:
139. 單詞拆分
416. 分割等和子集
3、最大最小問題:
474. 一和零
322. 零錢兌換

組合問題公式

dp[i] += dp[i-num]

True、False問題公式

dp[i] = dp[i] or dp[i-num]

最大最小問題公式

dp[i] = min(dp[i], dp[i-num]+1)或者dp[i] = max(dp[i], dp[i-num]+1)

以上三組公式是解決對應問題的核心公式。

當然拿到問題後,需要做到以下幾個步驟:

1.分析是否為揹包問題。
2.是以上三種揹包問題中的哪一種。
3.是0-1揹包問題還是完全揹包問題。也就是題目給的nums陣列中的元素是否可以重複使用。
4.如果是組合問題,是否需要考慮元素之間的順序。需要考慮順序有順序的解法,不需要考慮順序又有對應的解法。(也就是說求組合數還是排列數)

接下來講一下揹包問題的判定

揹包問題具備的特徵:給定一個target,target可以是數字也可以是字串,再給定一個數組nums,nums中裝的可能是數字,也可能是字串,問:能否使用nums中的元素做各種排列組合得到target。

揹包問題技巧:

1.如果是0-1揹包,即陣列中的元素不可重複使用,nums放在外迴圈,target在內迴圈,且內迴圈倒序;

for(int j=0;j<n;j++){
	int num = nums[j];
	for(int i=target;i>=num;i--){

	}
}

2.如果是完全揹包,即陣列中的元素可重複使用,nums放在外迴圈,target在內迴圈。且內迴圈正序。

for(int j=0;j<n;j++){
	int num = nums[j];
	for(int i=1;i<=target;i++){

	}
}

3.如果組合問題需考慮元素之間的順序,需將target放在外迴圈,將nums放在內迴圈。

for(int i=1;i<=target;i++){
    for(int j=0;j<n;j++){
        
    }
}