按字典序生成{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;
}
相關文章
- 生成{1,2,...,n}的排列的演算法-組合數學演算法
- 以反射Gray碼的順序生成0,1的n元組的演算法-組合數學反射演算法
- HDU 2582 f(n) (組合數的gcd)GC
- 有標號DAG計數 [容斥原理 子集反演 組合數學 fft]FFT
- 【演算法學習】組合數學演算法
- 【數學】組合數學 - 排列組合
- 求自然數的組合數的回溯演算法演算法
- 組合數學
- 函式組合的 N 種模式函式模式
- 《小 學 組 合 數 學》
- 【數學】組合數學 - 卡特蘭數
- 【原創】生成n*n蛇形矩陣的演算法矩陣演算法
- 組合數學筆記-排列與組合筆記
- 演算法學習筆記(16): 組合數學基礎演算法筆記
- 【組合數學】組合數學簡介 ( 組合思想 2 : 數學歸納法 | 數學歸納法推廣 | 多重歸納思想 )
- 51微控制器程式框架之帶順序的組合按鍵觸發框架
- 【演算法學習筆記】組合數與 Lucas 定理演算法筆記
- java的字典序排序Java排序
- 【學習筆記】組合數學筆記
- 組合數學學習筆記筆記
- 【R語言學習筆記】探索ggplot的排列組合(一)R語言筆記
- 不學無數——組合模式模式
- 組合數學 XKerror 筆記Error筆記
- 求無序陣列總第n大的數陣列
- 自動生成介面各種逆向組合引數
- 15.7 冪級數在組合數學中的應用
- 組合數學筆記-特殊計數數列筆記
- 給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。排序陣列
- 組合數學水題 $19$ 道
- POJ 1850 Code/POJ 1496 Word Index(組合數學-字母串序號)Index
- 簽名生成 引數列表(Map、List)ASCII碼從小到大排序(字典順序)ASCII排序
- MySQL分組排序取前N條記錄 以及 生成自動數字序列 的SQLMySql排序
- 【R語言學習筆記】探索ggplot的排列組合:線圖(一)R語言筆記
- 【POJ 2249】 Binomial Showdown 組合數學 排列組合計算
- js生成m-n之間的隨機數JS隨機
- 演算法 1~n中1的次數演算法
- java基礎:遍歷m取n的所有組合(轉)Java
- 【總結】求組合數的方法