給定乙個含不同整數的集合,返回其所有的子集.如果 s = [1,2,3],有如下的解:
[ [3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
]
求不同元素集合的全部子集問題,雖然網上有各種參考**,但是從**反過來去思考作者的思路很難。所以我一直認為**應該是寫給人看的,不應該過於追求**簡潔。
對於求子集問題,網路上ac的答案很多,解題方法有大致三種(推酷鏈結)。對於其中的遞迴解法**,我是看了很久不得要領,於是棄之,轉身自己琢磨。
首先,我們求 n 的階乘,很簡單。
int myfun(int n)
//將未知遞迴結果作為已知變數使用
int lastresult = myfun(n-1);
return n * lashresult ;
}
遞迴有幾個要素:
1. 退出條件
2. 引數變化
3. 遞推公式
對應的,在階乘中分別是
1. n是1或0
2. n每次減小1
3. (n的階乘) = n* (n-1的階乘)
然後,我們再去思考求子集問題。
[1,2,3]的子集:[ , [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3] ]
[1,2] 的子集:[ , [1], [2], [1,2] ]
[1] 的子集:[ , [1] ]
求123的子集的過程就是:[1,2]的子集裡每個元素末尾加3,再並上原來的[1,2]。
抽象下就是:對前乙個元素的結果進行處理即得到當前元素的結果。
類似於:
求10的階乘的過程就是:9的階乘乘以10
抽象下就是:對9的結果進行處理即為10的結果。
為了求[1,2,3]的子集,我們需要求[1,2]的子集,為了求[1,2]的子集,又需要求[1]的子集,這樣不斷的遞迴深入將集合縮小,直到集合只剩下乙個元素,此時 [1] 的子集就只有[ , [1] ] (空集和1本身),同時這時也達到退出條件,遞迴帶著[1]的子集返回,依次返回計算出[1,2]的子集,[1,2,3]的子集。
求子集遞迴的要素:
1. 退出條件:當源集合元素個數為1
2. 引數變化:求子集的源集合依次縮小1個元素
3. 遞推公式:[1,2,3]的子集是[1,2]每個子集新增3,然後並上原[1,2]子集
於是,**會類似求 n 的階乘:
//source: vector[1,2,3]
//ind : source的下標
//call : subsethelper(source, source.size()-1)
vector
> subsethelper(vector
& source, int ind)
//引數變化:ind-1縮小需要求子集的集合直至只剩乙個元素
result = subsethelper(source, ind - 1);
//遞推公式:下面是將上次遞迴結果運用到遞推公式
vector
> ori = result;
//遞推公式步驟1:對[1,2]的每個子集新增3
int i = 0;
for ( i = 0; i < result.size(); i++)
//遞推公式步驟2:將[1,2]的子集和加3後的子集合並
result.insert(result.end(), ori.begin(), ori.end());
return result;
}
#include
#include
#include
using
namespace
std;
void subsethelper(vector
& source, int ind, vector
>& result)
subsethelper(source, ind - 1, result);
vector
> ori = result;//複製集合
//2int i = 0;
for ( i = 0; i < result.size(); i++)
//3result.insert(result.end(), ori.begin(), ori.end());
}int main()
意猶未盡?更多解法/舉一反三 從遞迴到動規(學習筆記)
區別 動態規劃是由已知推未知,由子問題推大問題,由邊界值逆推,相當於遞迴的逆過程。解題思想 1.分解子問題 將原問題分為若干子問題,子問題形式與原問題相似,規模減小,子問題的解求出來即儲存,不影響其他子問題,避免重複求解。2.確定狀態 狀態就是與解相關的一組變數,例如數字三角形求到底邊最大值時,每個...
演算法!動態規劃!從遞迴到動態規劃!
動態規劃演算法一直都是計算機程式設計的核心演算法之一,是必須具備的幾種核心演算法之一。博主是在b站中學習來的,並加入了自己的理解,從而加強記憶。auther wei yunshi luoxian date 2020 01 16 19 54 public class dynamicplan otp e...
從遞迴到DP 01揹包問題初探
目錄 問題描述 1.純遞迴解決,容易溢位 2.記憶化搜尋法 3.由記憶化搜尋推導遞推關係,使用動態規劃法dp 備註 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。測試樣例 n 4,w 5 42 3 ...