社区
C++ Builder
帖子详情
关于数据的排列组合序列
wildhorse01
2002-12-09 04:45:51
我有20个数据,要在其中列出所有的N位数的排列和组合,本来是想用嵌套,可是的层数不定,我不知道该怎么做:)
...全文
103
10
打赏
收藏
关于数据的排列组合序列
我有20个数据,要在其中列出所有的N位数的排列和组合,本来是想用嵌套,可是的层数不定,我不知道该怎么做:)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BCB
2002-12-22
打赏
举报
回复
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------组合C(m,n)--------------------------------------------------------------
typedef
class Combination
{
private:
int m,n;
public:
int *Array; // 存放数
Combination(int m0,int n0);
~Combination();
void GetFirst(); // 初始化
bool GetNext(); // 取下一组
} Combination;
Combination::Combination(int m0,int n0)
{
m=m0;n=n0;
Array=new int[m+1];
GetFirst();
}
Combination::~Combination()
{
delete[] Array;
}
void Combination::GetFirst() // 无重复
{
for (int i=1;i<=m;i++)
Array[i]=i; // 首组下标,M个数
}
bool Combination::GetNext()
{ // 求下一组,若有返true,否则为假
for (int i=m;i>=1;i--)
{
int b=Array[i];
if (b<n-m+i) //x[i]是否到了极限n-m+i
{
for (int j=i;j<=m;j++)
{
b+=1;
Array[j]=b;
}
return(true);
}
}
return(false); // 元素全到了极限,该结束了
}
//----------排列P(m,n)---------------------------------------------------------
typedef
class Permutation
{
private:
int m,n;
bool *set; // 集合1..n
int Greater(int x); // 取集合中更大的元素
public:
int *Array; // 存放数
Permutation(int m0,int n0);
~Permutation();
void GetFirst(); // 初始化
bool GetNext(); // 取的下一组
} Permutation;
Permutation::Permutation(int m0,int n0)
{
m=m0;n=n0;
Array=new int[m+1];
set=new bool[n+1];
GetFirst();
}
Permutation::~Permutation()
{
delete[] Array;
delete[] set;
}
void Permutation::GetFirst()
{
for (int i=1;i<=m;i++)
{
Array[i]=i; // 首组下标,M个数
set[i]=false;
}
for (int i=m+1;i<=n;i++)
set[i]=true;
}
int Permutation::Greater(int x)
{ // 取集合中比x大的一个数,没有返0
for (int i=x+1;i<=n;i++)
if (set[i])
{
set[i]=false;
return(i);
}
return(0);
}
bool Permutation::GetNext()
{ // 求下一组,若有返true,否则为假
for (int i=m;i>=1;i--)
{
int b=Array[i];
int b1=Greater(b);
set[b]=true; // 放回集合中
if (b1!=0)
{
Array[i]=b1;
b=0;
for (int j=i+1;j<=m;j++)
{
b=Greater(b);
Array[j]=b;
}
return(true);
}
}
return(false); // 元素全到了极限,该结束了
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *d[100]; // 存放待排列的串
int m=4,n=6; // 从N数中取M个排列数
int js=0; // 组计数
d[1]="1"; d[2]="2";
d[3]="3"; d[4]="4";
d[5]="5"; d[6]="6";
Combination p(m,n); //C(4,6)=15组
do
{
String s="";
for (int i=1;i<=m;i++)
s=s+String(d[p.Array[i]])+" ";
Memo1->Lines->Add(s); // 显示
js=js+1;
}
while (p.GetNext()); //找下一组排列
Memo1->Lines->Add("共 "+String(js)+" 组");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char *d[100]; // 存放待排列的串
int m=4,n=6; // 从N数中取M个排列数
int js=0; // 组计数
d[1]="1"; d[2]="2";
d[3]="3"; d[4]="4";
d[5]="5"; d[6]="6";
Permutation p(m,n); //P(4,6)=360组
do
{
String s="";
for (int i=1;i<=m;i++)
s=s+String(d[p.Array[i]])+" ";
Memo1->Lines->Add(s); // 显示
js=js+1;
}
while (p.GetNext()); //找下一组排列
Memo1->Lines->Add("共 "+String(js)+" 组");
}
yuanque
2002-12-10
打赏
举报
回复
估计用递归可以做到,可以一试
BCB
2002-12-10
打赏
举报
回复
我专门搞过,排列与组合,很成功
待找到,给你贴上
wildhorse01
2002-12-10
打赏
举报
回复
帮忙看看吧?
BCB
2002-12-10
打赏
举报
回复
递归肯定可以,但我编过非递归的,在家里的机上,后天才能带来
clasj
2002-12-09
打赏
举报
回复
我用database desktop编辑数据库。
其中有一个字段的type属性我设为memo,但是我在哪里编辑这一字段的内容呢?
wildhorse01
2002-12-09
打赏
举报
回复
快来帮帮忙吧!
wildhorse01
2002-12-09
打赏
举报
回复
给个简单点的源码吧?
要多少分数都行:)
ghostwang
2002-12-09
打赏
举报
回复
要用递归函数来实现。
wildhorse01
2002-12-09
打赏
举报
回复
N个数中不能有重复:)
是不是罗嗦?
哎,高中和大学的排列组合,还有概率都没学好:(
【
数据
结构与算法】关于
排列组合
1、给出数字n,列出所有的
排列组合
的可能 【题目】: 【解法】: 用递归的方式2、给出一个数组,列出所有可能的
排列组合
序列
(不允许有重复) 【题目】: 【解法】: 3、给出数字n,k,返回所有
排列组合
序列
中的第k个
序列
【题目】: 【解法】: 【我自己的:出现了超时的错误】用了最简单的递归,超时了。实际上就是题目1的做法,只不过算到第k个就停止。 【参考另一种
python解决
排列组合
问题的4种方式
前言
排列组合
问题在是算法中很基础的一个问题,它们的区别就是,排列要考虑顺序,组合不考虑顺序。在面试的过程中可能会考到,在现实生活中也是经常可以遇到的,比如说一个3位数字的密码锁,要尝试多少次才能解开?那么用python有哪些方法可以解决此类问题呢? 问题 以一个具体的例子来说明在python中此类问题的可能解决方法,要求给定一个没有重复数字的
序列
,返回其所有可能的全排...
MATLAB_
排列组合
_组合生成程序
已知有m个箱子,箱子里分别有个球,所有球都不同。从每个箱子里都取出一个球,生成出所有的组合。 %% 函数定义 % 设有m个盒子,每个盒子里各有n1,n2,...,nm个不同的球。 % 从每个盒子中各取一个球,共有几种组合,列出所有组合。 function COM = Combination_MN(num_ball) %% 参数设置 % num_ball 每个盒子中球的个数,[n1,n2,...,nm]; num_box = length(num_ball); % 盒子个数 %% 函数体 NumCo...
SQL
排列组合
排列组合
是针对离散
数据
常用的
数据
组织方法,本节将分别介绍排列、组合的SQL实现方法,并结合实例着重介绍通过组合对
数据
的处理如何使用SQL实现排列与组合?本节将通过介绍分组对比统计场景,抽象出通用的解决方案本文尝试独辟蹊径,强调通过灵活的、发散性的
数据
处理思维,就可以用最基础的语法,解决复杂的
数据
场景。文章涉及的SQL语句使用了Hive SQL的基础语法和部分高级语法特性。
Python-求
排列组合
的方法
1. 调用 scipy 计算
排列组合
的具体数值 from scipy.special import comb, perm A = perm(3, 2) # out:A = 6.0 C = comb(3, 2) # out: C = 3.0 2. 调用 itertools 获取
排列组合
的全部情况 from itertools import combinations, permutations itering = permutations([1, 2, 3], 2) Alist = list(it
C++ Builder
13,826
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章