for i:=1 to 3
for j:=2 to 4
for k:=3 to 5
不知道对不对,没试,瞎蒙的
for j:=2 to 4
for k:=3 to 5
不知道对不对,没试,瞎蒙的
解决方案 »
- 有没有人有兴趣做个《航空霸业3》玩玩啊?
- 请教:本菜鸟用INDY做了个通讯小程序,但不知怎么发布,用WISE弄出的程序运行有界面,但登录没有反应。请高手指教!!
- 如何使在喷墨打印下的文档格式在针式打印下也一样!!!急呀!!!
- 散分!明天就要闯荡上海滩了,大家鼓励一下!
- 这个问题真的好难吗?竟然没人回答上来.关于在Dbgrid中显示备注型字段内容的问题?
- 问题:如何改变RichEdit的行间距?(无内容)
- delphi中的NMUDP控件到了7.0中是不是没有了?
- 请问delphi调用html help 做的.chm文件,如何通过f1打开帮助?请给出代码?可以上下文关联
- 如何设菜单的灰显效果
- 渴望成为一个优秀的程序员
- XML文件格式化输出问题
- 入门者问题,关于ADO
有:123 124 125 234 245 等。要全部的,并且不能出现象125 、 152 这样的重复号。
--------------------------------------------------
注意:您说到,是任意的个数中抽取任意个数的//应该是随机的;
全部组合//固定的;
所以,我觉的,你要以检查是否全部抽取到为外层,然后进行随机的抽取;
while Not 全部抽取时 do
begin
随机抽取;
for I := 0 to M do
begin
if 存在 then
begin
T := False;
Break;
end;
Inc(M);
end;
end;
for i:=1 to 5
for j:= i+1 to 5
for k:= j+1 to 5
begin
showmessage(inttostr(i) + inttostr(j) + inttostr(k));
end
ARRMax = 5;
a: array [1..ARRMAX] of integer=(1, 2, 3, 4, 5);
var
b: array [1..ARRMAX] of Integer;procedure print;
var
i: Integer;
begin
for i := 1 to ARRMax do
write(b[i]);
writeln;
end;procedure DoIt(w: Integer);
var
i: Integer;
begin
if w=ARRMAX+1 then Print
else
for i := w to ARRMAX do
begin
b[w] := a[i];
DoIt(w+1);
end;
end;{Main}
begin
DoIt(1);
end;
var
i: Integer;
begin
for i := 1 to 3 do
write(b[i]);
writeln;
end;procedure DoIt(w: Integer);
var
i: Integer;
begin
if w=4{要几个这儿就几+1} then Print
else
for i := w to ARRMAX do
begin
b[w] := a[i];
DoIt(w+1);
end;
end;
好象是怎样吧PM(n) = M*(M-1)*(M-2)*.....M(M-n+1),是个排列的问题吗~~
条件是m>n,我实在记不清了~~~~~错了别怪我
var
i: Integer;
begin
if w=3 then Print
else
if w=0 then
for i := 1 to ARRMAX do
begin
b[w+1] := a[i];
DoIt(w+1);
end
else
for i := b[w]+1 to ARRMAX do
begin
b[w+1] := a[i];
DoIt(w+1);
end;
end;
procedure DoIt(w: Integer);
var
i: Integer;
begin
if w=3 then Print
else
if w=0 then
for i := 1 to ARRMAX do
begin
b[w+1] := a[i];
DoIt(w+1);
end
else
for i := b[w]+1 to ARRMAX do
begin
b[w+1] := a[i];
DoIt(w+1);
end;
end;{main}
begin
DoIt(0);
end;
a[I+1] >a[I]
这是曾经的一道高程考试题目,用回溯法解决
ARRMax = 5;
a: array [1..ARRMAX] of integer=(1, 2, 3, 4, 5);
var
i,j,k: integer;
begin
for i:=1 to ARRMax
for j:= i+1 to ARRMax
for k:= j+1 to ARRMax
begin
showmessage(inttostr(i) + inttostr(j) + inttostr(k));
end
end;
到底是大家可能不懂还是你可能不懂!M个数去N个(M>=N)组合个数:M*(M-1)*...*(M-(N-1))/(N*(N-1)*...*1),你用计算器也好,口算也好,写程序也好.呵呵,算法问题!
至于随机的也不对。要一层一层的把数组排列出来才对。
可能对某些人来说理解不难,可是我不行。
再说简单一些。
从1到50之间,抽12个数的所有组合。
你来试试。写出来全部源程序。:)呵,编写了你就知道了。
for(int i=0;i<int(pow(js,js_needed));i++)
{
for(int j=0;j<js_needed;j++)
{
int jsindex=(i/int(pow(js,j)))%js;
cur_classroom.push(valid_classroom->Names[jsindex]);
}
if(valid_set(cur_classroom))
{
...
}
}
我的想法:
很明显,该模型可以转成如下模型:
(*********************************************************)
(* 给定一个长度为m的二进制串, 列出任n位为真的组合。 *)
(*********************************************************)// 因为下面用到幂乘,
// 这里借用一下BASIC里的幂乘运算符^,即a^b表示a的b次方首先想到的当然是最弱智的算法(未经优化的枚化法)
for I := 0 to 2^m -1 do
if TrueBitCount(I) = n then
Writeln(I);
// 如果位为真的数目为n, 则符合条件当m值很小时,这个算法也许还能忍受。
但当m值每加1时,工作量将呈几何级数增长。必须优化一下此算法!
显然,关键是如何找出下一个符合条件的数的值是什么!
观察此数列:(m = 5, n = 3)
0000 0111 至少得从111开始,我们记达到的最高位为t,此时t为2)
0000 1011 ( + 100 = 2^t))
0000 1101 ( + 010 = 2^(t-1))
0000 1110 ( + 001 = 2^(t-2)) (规律是:依次减1,直至为0为止)
0001 0011 ( +1000 = 2^(t)) (内循环结束,t将加1成为3)
0001 0101 ...
0001 0110 ...
0001 1001 ...
0001 1010 ...
0001 1100 ...+0001 = 2^(t- t) (无法再进位了,枚举结束)
------------------------------------
于是改进算法如下(为清晰起见,没对里面的幂乘优化,幂乘算法的优化相信只要学过3分钟编程的人都能写出来。)
-------------------------------------
Value := 2^n - 1;
for t := (n - 1) to (m - 2) do // 因为是从第0位开始,所以 m=5时,能达到的最高位为4
for I := t downto 0 do
Value := Value + 2^I; -------------------------------------呵呵,写得可能比较乱,不知大家能不能理解。
我同意westfly(西翔) 的看法,我的代码是在m个可用教室中选n个,另有若干条件判断哪一组最优。
因为可用教室及容量是dataset中取出的,不是简单的数字,不方便优化,所以专门用了个函数valid_set(cur_classroom))判断这个排列是否有效。
实际运行时如果可用教室有一百多个,需要的教室为8个时,超过十小时也没运行完。