一个组合数的求解谈开去

一个组合数的求解谈开去,第1张

一个组合数的求解谈开去,第2张

考试等级站排列:
10个中有7个不同的数字,如何找到所有的组合?
乍一看,这个问题真的不容易入手。虽然我们很容易理解这个问题,但计算机要“理解”它还需要一段时间。
先分析一下:首先认为如果一个数列由10个元素中的7个组成,并且这7个元素互不相等,则更接近正解;然后,考虑组合中的七个元素没有特定的顺序。如何消除冗余数据(例如,(1,3)和(3,1)在四分之二中是同一个解)?
我们可以在编程的时候做一个限制,七个元素的排列顺序满足我们的一个规定,这样就可以根据同一个位置的值不同来排除不正确的解。
这样,我们的第一个解就准备好了:数组可以用来选择,不同的数组下标序列代表不同的解。而且我们已经约定这个下标序列必须是升序的,这样有利于我们排除多余的值。
在本文中,同意这10个数字是以下形式的数组,并已被赋值。计算结果显示在TMemo控件中。
var
Value:array[1..10]的整数;

解决方案1。
点击按钮1的事件处理。
过程TForm1。Button1Click(发件人:to object);
var
idx1,idx2,idx3,idx4,idx5,idx6,id x7:integer;
tmpStr:string;
begin
Memo1线条清晰。

对于idx1:=1至4 do
对于idx2:=idx1+1至5 do
对于idx3:=idx2+1至6 do
对于idx4:=idx3+1至7 do
对于idx5:=idx4+1至8 do
对于idx6:=idx5+1至9 do
对于idx7:=idx6+1至10 do

begin
tmpStr:= IntToStr(idx 1)+' '+IntToStr(id x2)+' '+IntToStr(idx 3)
+' '+IntToStr(id x4)+' '+IntToStr(idx 5)+' '+IntToStr(idx 6)
+' '+IntToStr(idx 7);
Memo1。lines . Add(tmpStr);
end;
end;

解决方案中只显示了下标的组合。在实际应用中,把下标改成值数组就够了:tmp str:= inttostr(Value[idx 1])+' '+inttostr(Value[id x2])+...;。
这个解的一个亮点是,每个循环变量的初始值都是它的前一个变量加1;这确保了最后一个下标不能等于前一个下标。请理解为什么循环控制变量的最终值是4~10。

二。解
中学数学课本只是讲C(10,7)=C(10,3),很好理解。10选7,剩下3,7的组合全部完成,也就是3的组合全部完成,反之亦然。
按钮2的Click事件处理:
proceduretform 1 . button 2 Click(sender:object);
var
idx1,idx2,idx3,id x4:integer;
tmpStr:string;
begin
Memo1线条清晰。

for idx1:=1至8 do
for idx2:=idx1+1至9 do
for idx3:=idx2+1至10 do
begin
tmpStr:= ' ';
for id x4:= 1to 10 do
if(id x4 idx 1)and(id x4 id x2)//添加一个元素
then tmpstr:= tmpstr+inttostr(value[id x4])+'。

Memo1。lines . Add(tmpStr);
end;
end;
这个解决方案是十分之三,然后显示剩下的七个。是不是很有意思?
以上加元素的判断可以改写为:
if((idx 1+100)*(id x2+100)*(idx 3+100)mod(id x4+100)> 0)
请体验同余理论的应用。这里用100。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 一个组合数的求解谈开去

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情