首先得利用輔助陣列index來記錄所有選中元素的下標,對於輔助陣列index需滿足以下兩個條件:
(1)index[i + 1] > index[i],即後乙個元素的下標必須大於前乙個元素的下標
(2)index[i] - i <= m - n (從m個元素中選取n個元素的子集,i表示子集中的第i+1個元素)
假如現有一集合set,求集合set中選取3個元素的所有子集。大致流程如下:
(1)選取第乙個元素,此時i = 0, index[i] = 0,滿足以上兩個條件,擴大規模,i = 1,index[1] = index[0] + 1 = 1。按此方法繼續擴大規模,得到第一組解:index[0] = 0, index[1] = 1, index[2] = 2, i = 2
index[0] = 0, index[1] = 1, index[2] = 3, i = 3
index[0] = 0, index[1] = 1, index[2] = 4, i = 4
(3)當index[2] = 5時,不再滿足第二個條件,因此需要回溯到index[1],將index[1]調整為2,繼續按以上步驟繼續計算,直到從index[0]再回溯時,表明已經求出所有子集。
具體**實現如下:
#include using namespace std;
templatevoid output(t set, int index, int k, int n)
cout << set[index[i] + k];
flag = true;
}cout << "}" << endl;
return;
}//從集合set[k:m]中選取n個元素的集合
templateint subset(t set, int k, int m, int n)
index[i] = 0;
while (true)
i++; //繼續向前試探
index[i] = index[i - 1] + 1;
} else //回溯
index[--i]++;
} }
return 0;
}//生成集合set[k:m]的所有子集
templateint subset(t set, int k, int m)
return 0;
}int main(int argc, char *argv)
求集合的所有子集
現有乙個包含n個元素的集合s,求集合s的所有子集?例如 集合s包含三個元素,則它的所有子集為 空集 和。這裡先用位操作的思路來求解,具體方法 用2進製bit位來標記集合中的某個元素是否被選中,1代表選中,0代表未選中。例如集合的所有子集可如下表示 空集 0 0 0 0 0 1 0 1 0 1 0 0...
集合的所有子集
假設集合a 它的所有集合是 表示空集 可以這樣理解這張圖,從集合a的每個元素自身分析,它只有兩種狀態,或是某個子集的元素,或是不屬於任何子集,所以求子集的過程就可以看成對每個元素進行 取捨 的過程。n個元素有2的n次方個組合 每一層左邊節點表示加入該層元素,右邊表示不加入。第二層表示對第1個元素的處...
求集合元素的所有非空子集
現有乙個包含n個元素的集合s,求集合s的所有子集?例如 集合s包含三個元素,則它的所有子集為 空集 和。這 裡先用位操作的思路來求解,具體方法 用2進製bit位來標記集合中的某個元素是否被選中,1代表選中,0代表未選中。例如集合的所有子集可如下表示 0 0 1 0 1 0 1 0 0 0 1 1 1...