找出组合值等于一个指定值的算法?(50分)

  • 主题发起人 主题发起人 Flashcqxg
  • 开始时间 开始时间
F

Flashcqxg

Unregistered / Unconfirmed
GUEST, unregistred user!
比如给定一组数据,假设数据如下:
{1, 4, 6, 3, 5, 8, 9}
要找出值等于,比如15的所有组合,以此为例,应该有:
组合一:4,6,5
组合二:4,3,8
。。。。。
要例出全部
 
分太少,没大有兴趣了
从小到大排序,再来个穷举算法不就行了
那个15,叫做和值,呵呵,我都知道你在研究什么了
 
icc:
这个贴子的分就多,有没有兴趣?如果您觉得分还少,我可以再加,呵呵,只不过可能这个分不是那么好拿的。
有兴趣的话,去看看!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3621084
 
很不幸告诉你,ICC的说法是对的,你只有用穷举的方法来求.
更加不幸地告诉你,如果你是想用这求这个算法来解决那个问题的话,我可以告诉你.你是不可能实现的.
因为这个要求已经否决了你:如果一个学校的考生必须安排在几个考室的情况下,则必须排在连续的考室中,不能中间间隔一个其它学校的学生;
 
谢谢ICC 和 qqjm:
那没有其它办法呢???
 
LZ会不会解多元一次方程?
会的话应该很容易~~:)
 
eloveme:
请多多指点,谢谢。
 
eloveme:
您所说的是我现在这个问题还是另外一个网址上有问题?
麻烦您多多指教,有劳了!
 
我才猜你是不是在玩七星彩?
嵌套循环就可以做的到``就用多线程写吧
 
eloveme:
不是,我是在编排考场,原贴见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3621084
唉,我都没有头绪了.....
 
一元多次方程就是这样呀,真是开眼!
用减法成不成?
先把给定的数有大到小排列一下。
15-9=6,看6是否在数列中,在就是一个组合。9,6
6再减一个比6小的数6-5=1,看1是不是在数列中,在就是一个组合。9,5,1
6-4=2,2不在数列中,不是组合。
6-3=3,3在数列中,但之前已经用了,不是一个组合。
。。。。。。。。。。。。。。。。。
 
头都大了
关键是这个问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3621084
如果找到一种数学方法就好了...........
 
给你一个代码去参考,我做的是7元一次方程穷举
procedure TQiongJu.QiongJuFa;
var A1,B1,C1,D1,E1,F1,G1:integer;
A,B,C,D,E,F,G:integer;
begin
temp_RM.Clear;
for A1:=0 to 9do
begin
A:=A1;
FOR B1:=0 TO 9do
begin
B:=B1;
IF A+B >= temp_max then
Continue
else
begin
FOR C1:=0 TO 9do
begin
C:=C1;
IF A+B+C >= temp_max then
Continue
else
begin
FOR D1:=0 TO 9do
begin
D:=D1;
IF A+B+C+D >= temp_max then
Continue
else
begin
FOR E1 :=0 TO 9do
begin
E:=E1;
IF A+B+C+D+E >= temp_max then
Continue
else
begin
FOR F1:=0 TO 9do
begin
F:=F1;
IF A+B+C+D+E+F > temp_max then
Continue
else
begin
FOR G1:=0 TO 9do
begin
G:=G1;
IF (A+B+C+D+E+F+G >=temp_min) AND (A+B+C+D+E+F+G <=temp_max) then
begin
temp_RM.Lines.Append(INTTOSTR(A)+' '+INTTOSTR(B)+' '+INTTOSTR(C)+' '+INTTOSTR(D)+' '+INTTOSTR(E)+' '+INTTOSTR(F)+' '+INTTOSTR(G));
END
else
Continue;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
 
谢谢elovem:
这里的这个问题我翻以前的贴子弄出来了,就我们现在这个版块的版主LeeChange写的,代码如下:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
a: array [1..25] ofdo
uble = (9177.95, 15352.74, 73037.94, 42818.49, 66395.85,
76798.8, 4537.96, 13539.47, 43244.64, 13539.47,
109395, 95775.26, 20929.9, 17652.72, 15980.33,
4500.3, 11477.7, 33754.5, 13539.47, 13539.47,
1819.58, 27740.09, 87476.22, 59670, 1234.56);
Sum = 390135.32;
type
TNode = record
Sum:do
uble;
Used: set of Byte;
d: Integer
end;

var
Stack: array [0..25] of TNode;
Top: Integer;
i: Integer;
begin
Stack[0].Sum:=0;
Stack[0].Used:=[];
Stack[1].d:=0;
Top:=1;
while Top>0do
begin
while Stack[Top].d<25do
begin
Inc(Stack[Top].d);
if not (Stack[Top].d in Stack[Top-1].Used) then
begin
Stack[Top].Sum:=Stack[Top-1].Sum+a[Stack[Top].d];
if Abs(Stack[Top].Sum-Sum)<1e-05 then
begin
for i:=1 to Top-1do
Write(a[Stack.d]:0:2, '+');
WriteLn(a[Stack[Top].d]:0:2)
end
else
if Stack[Top].Sum<Sum then
begin
Stack[Top].Used:=Stack[Top-1].Used+[Stack[Top].d];
Inc(Top);
Stack[Top].d:=Stack[Top-1].d
end
end
end;
Dec(Top)
end;
WriteLn('OK');
ReadLn
end.

可以看看它的相关贴子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2293872
 
不过我最需要的问题却没有一点办法,不知道LeeChange肯不肯现身帮助一下!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3621084
 
后退
顶部