排列,(组合)问题.再加100分相送.难道没人要吗?(100分)

  • 主题发起人 主题发起人 benbenma
  • 开始时间 开始时间
请详细说说你的要求和目的等等,我还不明白你的意思
 
你说的是什么的排序
不说明白我也没法帮你
 
看过,能力不行
 
这个算法其实就是彩票模拟器中的复式投票的算法.
比如说.
在: 10,11,12,13,14五个数中去四个数的组合.(就是出现过的4个相同数字不能
在重复出现.
答案是.10,11,12,13
10,11,13,14
10,12,13,14
11,12,13,14
10,11,12,14
我知道这个算法在数学上肯定有.但是我凭空像就是想不出来.请各位高手帮帮忙.
 
program Combine;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
n, r, i, j, k: Integer;
a, b: array [0..100] of Integer;
begin
Write('Input n, r:');
Read(n, r);
for i := 1 to r do
begin
a := i;
b := n - r + i;
end;
k := r;
j := 0;
Writeln('Combination: ');
repeat
if k = r then
begin
j := j + 1;
Write('No.', j:3, '[');
for i := 1 to r do write(a, ' ');
Writeln(']');
end;
if a[k] &lt
b[k] then
begin
a[k] := a[k] + 1;
if k &lt
r then
for k := k + 1 to r do a[k] := a[k - 1] + 1;
end
else
k := k - 1;
until k = 0;
end.
 
这是一个控制台程序。Delphi5下调试通过。
Menu - File - New - Console Application - ...

运行时:
Input n, r: 输入 9 7 回车。
 
从n个数中取m个数的组合:
procedure TForm1.Button1Click(Sender: TObject);
var i,j :integer;
p : array of integer;
s : array of integer;
str : string;
begin
setlength(p,m);
for i := 0 to m-1 do p:=i;
p[m-1] := p[m-2];
setlength(s,n);
for i := 0 to n-1 do s:=i;

sum := 0;
while true do
begin
inc(p[m-1]);
str :='';
for j:=0 to length(p)-1 do
str := str+inttostr(s[p[j]])+',';
listbox1.items.add('---------------');
listbox1.items.add(str);

if p[0]=(n-m) then break;
for i:=1 to m-1 do
if p=n-(m-i) then
begin
p[i-1] := p[i-1]+1;
for j:=i to m-2 do
p[j] := p[j-1]+1;
p[m-1]:=p[m-2];
break;
end;
end;
end;

好烦啊!测了n久!
 
gmwu:
由于我没能看懂你的算法,所以照抄.发现
p,sum没有定义.干脆你把编译通的程序
.从unit ......
end. 全部念贴上来把.
顺便再给我讲讲设计思路.
谢谢!
 
好啊,源代码如下:
看看注释就明白了!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;//用于显示结果
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
const
m = 3;//随便改,只要m<=n
n = 7;

var sum : integer;//记录当前输出的是第几个答案
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var i,j :integer;
p : array of integer;//指针数组,其内容为选取的数在s中的标号
//长度为m
s : array of integer;//源数组 长度为n
str : string;//输出结果暂存
begin
//初始化p
setlength(p,m);
for i := 0 to m-1 do p:=i;
p[m-1] := p[m-2];
//初始化s
setlength(s,n);
for i := 0 to n-1 do s:=i;//此处的赋值,可根据你的需要

sum := 0;
while true do
begin
inc(p[m-1]);
str :='';
//得到一个结果
for j:=0 to length(p)-1 do
str := str+inttostr(s[p[j]])+',';
//output
listbox1.items.add('---------------');
inc(sum);
listbox1.items.add(inttostr(sum));
listbox1.items.add(str);

//如果所有指针都排到s之末尾,则找到所有解
//结束循化
if p[0]=(n-m) then break;
//将指针往后移动
//以遍历所有的数
for i:=1 to m-1 do
if p=n-(m-i) then
begin
p[i-1] := p[i-1]+1;
for j:=i to m-2 do
p[j] := p[j-1]+1;
p[m-1]:=p[m-2];
break;
end;
end;
end;

end.
 
gmwu的代码,真是非常好,非常正确,非常通用.太好了.
谢谢!谢谢!
我真想把所有的分都给你,但是我想还是留着以后再问问题用吧,呵呵!
+150分
croco的代码也很好,不过有其局限性 +50分
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
603
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
473
import
I
后退
顶部