首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-02-12 
求,排列组合的问题算法(可以追加分数的)一串字符组合,要求:1、所有字符、下划线、数字2、数字不能出现在第一位

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

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个字符串就好了吧 不用枚举所有的

热点排行