求,排列组合的有关问题算法(可以追加分数的)

求,排列组合的问题算法(可以追加分数的)
一串字符组合,要求:

1、所有字符、下划线、数字
2、数字不能出现在第一位
3、字符串长度最小5,最长20
4、输出到memo中
5、尽量满足运算高效

delphi7下用,语言也可以的,使用递归做的也好!



------解决方案--------------------
//组合函数,调用例子: Combine( '0123456789 ', memo1.Lines, 4);

procedure Combine(CSet: string; sl: TStrings; Num: Integer);



unit Comb;

interface

uses Classes;

procedure Combine(CSet: string; sl: TStrings; Num: Integer);

implementation

var
n, r: Integer; // n - 字符集数目 r - 取出的数目
c: array[0..10] of Integer;
used: array[0..10] of Integer;

procedure Combine_1(ss: string; sl: TStrings; p, h: Integer);
var
i: Integer;
s: string;
begin
if p = r then begin
s := ' ';
for i := 0 to r - 1 do s := s + ss[c[i] + 1];
sl.Add(s);
Exit;
end;

for i := h to n - r + p do
if Used[i] = 0 then begin
c[p] := i;
Inc(used[i]);
Combine_1(ss, sl, p + 1, i + 1);
Dec(used[i]);
end;
end;

procedure Combine(CSet: string; sl: TStrings; Num: Integer);
var
i: Integer;
begin
for i := 0 to 10 do used[i] := 0;
n := Length(CSet);
r := Num;
Combine_1(CSet, sl, 0, 0);
end;


上面的是组合算法,可以在输出的时候做一下修改,检查是否符合要求即可

------解决方案--------------------
1. 楼主没有说明是否区分大小写
2. 按楼主的描述,其是想列出所有满足要求的组合,但即使在不区分大小写的情况下,其数目有
27 * 37^4 * 38^15 = 25172399155341030525534462050304 种
如果要存储这么种组合,如果每个字串使用20个字节存放, 则需要
457883273253920024681 TB 存储空间
假设目前世界是有50亿台PC, 每个PC有 1 TB存储空间,其也只能存储楼主所需要的内存的 1/91576654650

------解决方案--------------------
LZ应该只要随机生成1个字符串就好了吧 不用枚举所有的