求一个算法。急!(200分)

  • 主题发起人 dadabox1
  • 开始时间
D

dadabox1

Unregistered / Unconfirmed
GUEST, unregistred user!
我有12个数,限定7位为一个组合,给出几个指定数后,再求其他几个数的组合。
如:1,2,3,4,5,6,7,8,9,10,11,12
指定了1,2,3,4,5后,还剩下6,7,8,9,10,11,12
而能组成的组合是:
6,7
6,8
6,9
6,10
6,11
6,12
7,8
7,9
7,10
7,11
7,12
8,9
8,10
8,11
8,12
9,10
9,11
9,12
10,11
10,12
11,12
等21种组合,那么我希望灵活的给定每一个数,得出所有的组合,如我给出15个数,指定4
个数,算剩下的组合有哪些。
注意:我的要求是能灵活给出每一个数,然后得到所有的组合。
 
嗯...
先占个位置
working......
 
procedure TForm1.Button1Click(Sender: TObject);
var
All : TStrings;
NeedCalc: TStrings;
I : Integer;
j : Integer;
begin
all := Tstringlist.Create;
needCalc := Tstringlist.Create;
All.Assign(Memo1.Lines);
NeedCalc.Assign (Memo2.Lines);
for I:=0 to All.Count - 1 do
begin
if NeedCalc.Strings = All.strings then
begin
for j := i + 1 to All.Count - 1 do
begin
if needCalc.Strings[j] = all.Strings[j] then
memo3.Lines.Add(all.strings + ',' + CalcNeed.strings[j])
end;
end;
end;
end;
搞定
这里的all是所有数的列表
needCalc是去除选定数字以后的列表
你只要根据要求生成TStringList传过来就可以了
 
arrnum:array of integer;
for I:=1 to 15 do
arrnum:=i;
for i:=6 to 15-4
for J:=I to I+4
......
 
老兄,你试过没有呀,不行!
 
楼主:说明白些!你的12345既然都不用,还给出干什么?要我直接理解,我感觉你就是在
要6至12的共7个数中取二个数的组合啊!到底什么意思啊?给出个用n、m、j、k表示的通式
好吗?
 
就是说给出多少个数字,比说是12个是动态的,我可以随便给;
生成多少数字的组合,比如说生成7位,也是动态的,我可以随便给;
而给定多少数字,比如说4个等等,便是动态的,随便给。
我需要这样一个函数,输入几个参数,生成全部组合。不知说明白了没有。
谢谢!
 
你在楼顶的帖子里只体现了剩余的7个数的“C(7,2)”的组合啊,并没有体现出12345是
做什么用的,你函数本意是要f(a,b) a是总共的集合,例如a={1..12},b是排除在外的
集合,例如b={1..5}那你不就是要求出集合(a-b)的C(7,2)吗?那何苦给出集合b呢?直
接给出集合a'={6..12},求a'的C(7,2)组合不就行吗?总结成通用计算方法就是:
集合(a-b)的C(7,2)组合。
不过我想你肯定不是这个意思,否则你就不会问了,所以说清楚一些啊。
 
并且我不知道你说的“7位”是什么意思,你楼顶的例子并没有“位”的概念啊,都是两个
两个的数在那里放着呢,并没有组成“7位”的东西啊。我理解的“7位”就是:1234567,
8290331、acacbac、7758521,这都是7位排列,你所说的7位是什么呢?
 
我的意思是给出一个全部的集合,比如说从1-12,而选定了一些数后,实际上是可以不管选
定数字了,因为这些是固定的,只够没有选定的,看他们有多少个组合.选定的部分最后加
上去就行了.只是全部的数字没有固定,选定多少数字,以及要生成几个数字的组合等等,
都是不固定的,根据我给出参数而计算.
 
我看明白了你的意思:
你是一个7位的数,给定了前面的几位,求后面几位的组合(注意是组合):
你看这样行不行啊:
给定的数的集合a(1..12),要求的数的位数7
指定数的集合b(1..5) ,位数5,剩下的组合数是:C(7,2)
可选数的个数为A,指定数的个数为B,要求位数为I,剩下组合是C((A-B),(I-B))
计算公式就不要了吧?——(A-B)!/{[(A-B)-(I-B)]!*(I-B)!}
 
应该直接从数学上去分析吧,你的意思我得不是很明白。
 
我就是想写出来,但觉得很头大。所以才要来求一个函数。上面那点分析我也知道呀,但就
是写程序很麻烦呀。
 
我懂了你的意思了
在占个位置
继续Working.....
 
唉....
假设有a[1..m],要求其中n个的组合,其中k个已经确定,先确定两个变量
一个是n-k,我们称之为 NotEnSureNo
一个是a[1..m]中去除已确定的k个以后的b[1..m-k],把他放到TstringList里为ElmentList
声明一个GroupList用来存储结果
全局变量:
var
ElmentList : TstringList;
NotEnSureNo :integer;
GroupList : TStringList;
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure Calc(var Temp: TstringList);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ElementList : TStringList;
GroupList :TstringList;
NotenSureNO : Integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
Temp:TstringList;
begin
NotEnSureNo := 3;
EleMentList := TSTringList.Create;
GroupList := TSTringList.Create;
for i:=1 to 12 do
ElementList.Add(IntToStr(i));
temp:= TstringList.Create;
Calc(Temp);
temp.Free;
memo1.Lines.Assign(GroupList);
end;

Procedure TForm1.Calc(var Temp:TstringList);
var
i:Integer;
temptemp :TStringList;
begin
temptemp:= TstringList.Create;
if Temp.Count < NotEnSureNo then
begin
For i:=0 to ElementList.Count -1 do
begin
if temp.IndexOf(EleMentList.Strings) = -1 then
begin
temp.Add(ElementList.Strings);
temptemp.Assign(temp);
temp.Delete(temp.Count -1);
Calc(Temptemp);
end;
end;
end
else
begin
temp.Sort;
if GroupList.IndexOf(Temp.commatext) = -1 then
GroupList.add(temp.CommaText);
end;
temptemp.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ElementList.Free;
GroupList.Free;
end;

end.

这下全部搞定了
 
给分给分
花了偶快一个小时
 
谢谢你的代码。
 
顶部