求算法排列组合(100分)

  • 主题发起人 主题发起人 brt
  • 开始时间 开始时间
B

brt

Unregistered / Unconfirmed
GUEST, unregistred user!
以足彩13场全买310为例,共3的13次方1594323注,求能在20-30秒内列出全部1594323注结果的算法。(适用性要强)1000分等你呀,up有分
 
我不懂足彩,数据怎么取的?
是不是1..13
 
直接循环不行么?
 
to:yostgxf
足彩13场全买310为例
第1场 取其中一个数字 3 , 1 , 0
第2场 取其中一个数字 3 , 1 , 0
第3场 取其中一个数字 3 , 1 , 0
第4场 取其中一个数字 3 , 1 , 0
第5场 取其中一个数字 3 , 1 , 0
第6场 取其中一个数字 3 , 1 , 0
第7场 取其中一个数字 3 , 1 , 0
第8场 取其中一个数字 3 , 1 , 0
第9场 取其中一个数字 3 , 1 , 0
第10场 取其中一个数字 3 , 1 , 0
第11场 取其中一个数字 3 , 1 , 0
第12场 取其中一个数字 3 , 1 , 0
第13场 取其中一个数字 3 , 1 , 0
EG:3 1 0 3 3 1 0 0 1 3 0 3 3 这是其中一个结果
To:来如风
速度太慢了
 
要列出全部结果直接循环已经最快了
 
列出全部1594323注结果的算法?要效率够高?
用银河机吧……
 
要排列組合,這個版,這種帖子多的是,翻翻就會發現的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1008308
 
To:lichdr
此贴已拜读若干遍 1:适用性还不够,较理想化。 2:速度不够
冥思苦想中。。。。。。[?]
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2472989
 
给个思路:
不是总共有1594323种组合吗?对小于1594323的数字求其长度为13的三进制表示不
就行了吗。如:对于5可以求出其三进制表示为0000000000012,然后将2换成3。
0000000000013。没实验,不知道速度怎么样。
 
大富翁怎么了?总是上不来。
按照上述思路写的,平均花费5秒,赛扬500,192M内存,结果保存在“c:/rst.txt”中。
代码:
procedure TForm1.Button1Click(Sender: TObject);
var      
        s : TMemoryStream;
        buf : PChar;
        ca : array[0..2] of char;
        t,v,i,j,bufp : DWORD;
begin
  t := GetTickCount;
  buf := AllocMem(1594323 * 15);
  ca[0] := '0';
ca[1] := '1';
ca[2] := '3';
  bufp := 14;
  for i := 0 to 1594323 - 1do
    begin
      buf[bufp] := #10;
dec(bufp);
      buf[bufp] := #13;
dec(bufp);
      v := i;
      for j := 0 to 12do
        begin
          buf[bufp] := ca[v mod 3];
          v := v div 3;
          dec(bufp);
        end;
      bufp := bufp + 29;
    end;
  s := TMemoryStream.Create;
  s.Write(buf^,1594323 * 15);
  s.SaveToFile('c:/rst.txt');
  s.Free;
  FreeMem(buf);
  showmessage('cost:' + IntToStr(GetTickCount - t) + 'ms');
end;
 
To:ASCII 适用性要强,这样怎么办?
第1场 取其中一个数字 3 , 1 , 0
第2场 取其中一个数字 3 , 2
第3场 取其中一个数字 3 , 1 , 0
第4场 取其中一个数字 3 , 1 , 0
第5场 取其中一个数字 3
第6场 取其中一个数字 3 , 1 , 0
第7场 取其中一个数字 3 , 0
第8场 取其中一个数字 3 , 2 , 0
第9场 取其中一个数字 1
第10场 取其中一个数字 3 , 2 , 1 , 0
第11场 取其中一个数字 3 , 1
第12场 取其中一个数字 0
第13场 取其中一个数字 3 , 1 , 0 , 2
按您的方法。。。。。。

 
to 楼主:
就这1594323个结果用现在的计算机(偶是P4 1.7)来算,就是一点不优化也会在百毫秒内搞定。偶估计你说的时间大概是包括显示的时间,显示怎样提高效率还真有点罗嗦呢。
至于你说的适用性,你看这样行不行:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
Source: array [1..13] of string;
Stack: array [1..13] of Integer;
Top: Integer;
s: string;
i: Integer;
begin
for i:=1 to 13do
ReadLn(Source);
Top:=1;
Stack[Top]:=0;
while Top>0do
begin
while Stack[Top]<Length(Source[Top])do
begin
Inc(Stack[Top]);
if Top=13 then
begin
s:='';
for i:=1 to Topdo
s:=s+Source[i, Stack];
WriteLn(s)
end
else
begin
Inc(Top);
Stack[Top]:=0
end
end;
Dec(Top)
end;
ReadLn
end.
输入13个字符串,对应您的数据,就这样输入:
310
32
310
310
3
310
30
320
1
3210
31
0
3210
 
稍加改进就可以了,改为多进制的表示形式。多进制在生活中是有的,如:时间的表示
按照你的第二个例子,其中进制数从高到低为:3,2,3,3,1,3,2,3,1,4,2,1,4
我主要是告诉你思路,如果你需要源代码,支一声。
 
To:ASCII
老兄给份源代码,加点注释更感激不尽。
偶需要这个不是搞足彩,是搞股票,能否把记录序号添在一个edit中在label中显示程序生成的记录。eg:edit1.text:='5 ' 在 label.caption:='0000000000013',如可行1000分都给你啦。发至:hxcpa@163.com
To:LeeChange
偶看看分另给:)
怎么出现这种情况
1133113313303
1131333313303
1131313313303
1131133313303
1131113313303
1113333313303
1113313313303
1113133313303
11131133133 //数据不完整
T0:other
解贴时都有份:)
 
邮件已发送至 hxcpa@163.com
 
呵呵,看看代码,只要是输出,应该都是13个字符的吧。
if Top=13 then
begin
s:='';
for i:=1 to Topdo
s:=s+Source[i, Stack];
WriteLn(s)
end
是不是在输入的时候,字符串里多了空格。
 
To:ASCII给偶的最完整给10分留念其它1000分另发贴注意查收
To:LeeChange希望给偶个完整代码,Email : hxcpa@163.com,分再给
To:other 谢谢各位。
 
hehe,偶的代码是完整的。
哎,看来大家不喜欢看控制台程序。
 
后退
顶部