排列,(组合)问题.以100分相送.(100分)

  • 主题发起人 主题发起人 benbenma
  • 开始时间 开始时间
B

benbenma

Unregistered / Unconfirmed
GUEST, unregistred user!
如从9个数字中取 七个数字的组合,
一般我最多会要求输入15个左右的数字,求七个数字的全部组合.
EG: 1,2,3,4
1,2,3
1,3,4
1,2,4
2,3,4
 
你是要程序的源代码吗?
 
在循环中用集合判断即可
 
我要程序的源代码.谢谢!
 
但我没法写,我想得分,说算法吧:

var
answer: array of Integer
//存储答案
data: array of Integer
//存储所有数字
procedure GetNumber(No: Integer);
var
i, j:integer;
begin
for i := answer[no -1] + 1 to all - allget + no do
begin
answer[no] := i;
if no = allget then
begin
for j := 1 to allget do
write(data[answer[j]],' ');
end;
end;
end;

all := 15;
allget := 7;
for i := 1 to all - allget do
begin
answer[1] := i;
getNumber(2);
end;
 
superMMX:
你的算法我有些看不懂,能不能讲的明白些.
??? for i := answer[no -1] + 1 to all - allget + no do

你的算法是从15个数中穷举7个数的组合吗?

 
此题如此重要么?
 
不太懂你的意思。
不过从你的EG来看,
先将数排序后再处理就容易多了。
 
》》你的算法是从15个数中穷举7个数的组合吗?

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.
 
在: 10,11,12,13,14五个数中去四个数的组合.(就是出现过的4个相同数字不能
在重复出现.
没看懂这一句。

另: 我写的只是一个大概的算法,没有测试(因为现在没条件)
只能是穷举法。

我的算法是这样的:
1,认为你的数据没有重复,
2,结果的第一个数的范围从 1 到 总数 - 取出的个数 + 1
3,第 n 个数的范围从 前一个数在全部数中的位置的下一个 到
总数 - 剩下的数 + 1

就这么简单。
我写的范围有点问题,这次应该对了。
 
Croco:
我好像还没讲清楚.
我希望的10,11,12,13,14五个数中取四个数的组合
~~~~~~~~~~~~~~~~~~~/是自由附值的.
eg:
read(n);//n是从几个数中取.
for i:=1 to n do
read(a);
而你的结果是从1开始的.
谢谢!
 
program Combine;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
n, r, i, j, k: Integer;
a, b: array [0..100] of Integer;

x: array [1..5] of Integer;
begin
// Write('Input n, r:');
// Read(n, r);
n := 5;
r := 4;
x[1] := 10;
x[2] := 11;
x[3] := 12;
x[4] := 13;
x[5] := 14;
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(x[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;
Readln;
end.
 
多人接受答案了。
 
后退
顶部