按字典序生成{1,2,...,n}的r子集的演算法-組合數學
按字典序生成{1,2,...,n}的r子集的演算法
演算法步驟:
從r子集a[1]a[2]...a[r]=12...r開始。
當a[1]a[2]...a[r]!=(n-r+1)(n-r+2)...n時,執行下列操作:
①確定最大的整數k,使得a[k]+1<=n且a[k]+1不是a[1],a[2],...,a[r]中的一個;
②用r子集a[1]...a[k-1](a[k]+1)(a[k]+2)...(a[k]+r-k+1)替換a[1]a[2]...a[r]。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 10000
int n,r;
int a[maxn];
void Init()//初始化
{
for(int i=1; i<=r; ++i)
a[i]=i;
}
bool Check()//檢查a[1]a[2]...a[r]!=(n-r+1)(n-r+2)...n
{
int j=1;
for(int i=1; i<=r; ++i)
{
if(a[i]!=n-r+j)
return false;
++j;
}
return true;
}
bool Contain(int k)//判斷a[k]+1是否為a[1],a[2],...,a[r]中的一個
{
for(int i=1; i<=r; ++i)
if(k==a[i])
return false;
return true;
}
int Findk()//確定最大的整數k,使得a[k]+1<=n且a[k]+1不是a[1],a[2],...,a[r]中的一個
{
int Max=-1,temp=-1;
for(int i=1; i<=r; ++i)
if(a[i]+1<=n&&Contain(a[i]+1))
if(Max<a[i])
{
Max=a[i];
temp=i;
}
return temp;
}
void Change(int k)//用r子集a[1]...a[k-1](a[k]+1)(a[k]+2)...(a[k]+r-k+1)替換a[1]a[2]...a[r]
{
int j=1,t=a[k];
for(int i=k; i<=r; ++i)
{
a[i]=t+j;
++j;
if(j>r-k+1) break;
}
}
void Out()//輸出當前的排列情況
{
for(int i=1; i<=r; ++i)
cout<<a[i];
cout<<endl;
}
int main()
{
cin>>n>>r;
Init();
Out();
while(!Check())
{
Change(Findk());
Out();
//system("pause");
}
return 0;
}
相關文章
- 組合數學與一元n次方
- 【演算法學習】組合數學演算法
- 【數學】組合數學 - 排列組合
- 函式組合的 N 種模式函式模式
- 組合數學
- 51微控制器程式框架之帶順序的組合按鍵觸發框架
- 《小 學 組 合 數 學》
- 演算法學習筆記(16): 組合數學基礎演算法筆記
- 【數學】組合數學 - 卡特蘭數
- 組合數學筆記-排列與組合筆記
- 【演算法學習筆記】組合數與 Lucas 定理演算法筆記
- 【組合數學】組合數學簡介 ( 組合思想 2 : 數學歸納法 | 數學歸納法推廣 | 多重歸納思想 )
- 簽名生成 引數列表(Map、List)ASCII碼從小到大排序(字典順序)ASCII排序
- N個人,按M進行分組
- 給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。排序陣列
- 15.7 冪級數在組合數學中的應用
- 組合數學學習筆記筆記
- 【學習筆記】組合數學筆記
- 組合數的逆元求法
- 細數驗證碼的N種生成方式
- 演算法 1~n中1的次數演算法
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- 不學無數——組合模式模式
- 2024.4.6 組合數學補題
- 組合數學 XKerror 筆記Error筆記
- 報數:有n個人做成一圈,按順序1到n編好號。從第一個人開始報數,報到m(m<n)的人退出圈子。如此下去,直到留下最後一個人,輸入整數n和m,並按退出順序輸出退出圈子的人的編號。
- 自動生成介面各種逆向組合引數
- 【POJ 2249】 Binomial Showdown 組合數學 排列組合計算
- leetcode 深度搜尋 1641.統計字典序母音字串的數目LeetCode字串
- Python的元組()與字典{}Python
- Python的元組()與字典 { }Python
- 一元8次方的組合數學與代數
- 一元6次方的組合數學與代數
- 一元7次方的組合數學與代數
- 組合數學筆記-特殊計數數列筆記
- 組合數學水題 $19$ 道
- 全排列及相關擴充套件演算法(二)——求字典序下一組排列及全排列演算法套件演算法
- JavaScript是按順序執行的嗎?聊聊JavaScript中的變數提升JavaScript變數
- 【字典序第k小】