127分求正解!!! (127分)

  • 主题发起人 主题发起人 ranyang
  • 开始时间 开始时间
R

ranyang

Unregistered / Unconfirmed
GUEST, unregistred user!
有很多数字:
a1,a2,a3,a4,a5,a6,a7,a8.................ax.........
求有多少种可能的加,,,,,
排列出来:
比如:有1,2,3,4,5,
就应该有:
1+2
1+2+3
1+2+3+4
1+2+3+4+5
2+3
2+3+4
2+3+4+5
3+4
3+4+5
4+5
1+3
1+4
1+5
2+4
2+5
3+5
1+2+4
1+2+5
1+2+3+5
2+3+5
1+3+5
1+4+5
2+4+5
1+2+4+5
 
记得以前有个帖子就是这样的内容,我也贴过代码的,我找找看
 
谢谢你!能给我贴一个吗
 
你的这些数字要不要去除同样的情况啊?比如,1,2,2,3,是不是只当1,2,3算的啊?
我找到代码了,整理一下贴
 
不可以!1,2,2,3。。。。。
要算两个2
 
mi:integer;
// 总个数
sba:array of byte;
ms:array of integer;
// string;
数值 或 数据串
si1:integer;
ss:string;
// 构成串
SetLength(sba,mi);
Fillchar(sba,sizeof(sba),#0);
repeat
for si1:=0 to mi-1do
begin
if sba[si1]=0 then
begin
inc(sba[si1]);
break;
end else
sba[si1]:=0;
end;
if si1=mi then
break;
ss:='';
for si1:=0 to mi-1do
if sba[si1]=1 then
begin
if ss>'' then
ss:=ss+'+';
ss:=ss+IntToStr(ms[si1]);
end;
Memo1.Lines.Add(ss);
until si1=mi;
 
不是排列组合嘛
easy
 
那你就给我写一个排列看看嘛!不要只说有什么用
 
最好要方法!不要代码
 
用深度优先的方法。
以5个数字为例,看下面的排列顺序:
1+2
1+2+3
1+2+3+4
1+2+3+4+5
1+2+3+5
1+2+4
1+2+4+5
1+2+5
在没排列到最后1个数字之前(如1+2+3,还没排列到5),都可以在原来结果基础上多排列1个数字,这个多排列的数字取值范围:前面排列过的数字后面那个开始直到最后一个数字。
当排列到最后1个数字时(如1+2+3+5),要减少1个数字了(1+2+3)排出下一个(1+2+4),再继续。
var StartP,NowP,X,i:integer;
// StartP指向排列结果第1个数字 NowP现在排列到第
a:array[1..5] of integer;
// 要求排列组合的内容
R:array[1..5] of integer;
// 记录结果,即数组a的下标
sResult:string;
// 输出结果字符串
begin
X:=5;
for i:=1 to Xdo
a:=i;
// 可以是任何值
for StartP:=1 to X-1do
begin
R[StartP]:=StartP;
NowP:=StartP+1;
R[NowP]:=NowP;
repeat
// 输出结果
sResult:=IntToStr(R[StartP]);
for i:=StartP+1 to NowPdo
sResult:=sResult+'+'+IntToStr(a[R]);
Memo1.Lines.Add(sResult);
// 排列出下一个
if R[NowP]<X then
begin
inc(NowP);
R[NowP]:=R[NowP-1]+1;
end // 在没排列到最后1个数字之前
else
begin
dec(NowP);
inc(R[NowP]);
end;
//当排列到最后1个数字时
until NowP=StartP
end;
end;
 
做一个数组,与提供的一组数的个数相同;数组的每个数对应一个数据;
赋零;
对数据的每项做二进制加法,每次从最低端加1,直到溢出;
每加一次,查这个数组的每一个数,
=0:对应的数据不出现在表达式中;
=1:对应的数据出现在表达式中;
 
多人接受答案了。
 
后退
顶部