按字典序生成{1,2,...,n}的r子集的算法-组合数学
来源:互联网 发布:阮佳网络班视频 编辑:程序博客网 时间:2024/06/06 02:47
按字典序生成{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 10000int 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;}
0 0
- 按字典序生成{1,2,...,n}的r子集的算法-组合数学
- 生成{1,2,..n}的字典序r-组合算法
- 生成{1,2,...,n}的排列的算法-组合数学
- 任意N个数的子集生成算法
- 生成1~~n的排列 && 子集
- 以反射Gray码的顺序生成0,1的n元组的算法-组合数学
- 排列、R子集字典序
- 列出{1,2,,,,n}的所有子集
- 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合
- 生成1~n的字典输出
- 按照字典序生成1--n的排列
- 组合数学 字典序法生成序列C语言实现
- 集合中子集的生成算法
- 组合的生成算法
- 从自然数1~N里任取R个数的可能组合
- n中任取r个数的所有组合
- 字典序生成组合
- 排列的生成算法 字典序
- mtd-utils命令简介
- 第7周项目6 -停车场模拟
- 在页面上弹出一个小页面实现方法2
- jdbcTest
- [JAVA基础]String的format
- 按字典序生成{1,2,...,n}的r子集的算法-组合数学
- 递归算法——求Fibonacci数列前n项(Java实现&C语言实现)
- Apple HLS: comparing versions
- 关于javascript中的this
- virtual function table in c++
- 各大网络请求框架的比较
- ssh框架整合基础配置
- Gradle 指定仓库位置或工作目录
- 提问的智慧