请两位版主 LeeChange 张剑波 来帮帮我吧,谢谢!(0分)

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

Flashcqxg

Unregistered / Unconfirmed
GUEST, unregistred user!
实在没有办法了,我的那个递归算法当N越大的时候,速度越让人怕呀
帖子地址:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3925980
谢谢呀!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2293872
 
谢谢版主。
我先仔细研究下代码,好多地方还读不懂。
还要测试大量的数据,看看速度怎么样。
 
LeeChange :
看了你的代码,也能正常运行。
我现在想要只要找到一组的和为指定的Sum的时候,就退出循环,试了半天,始终退不出来,还请LeeChange 指点下。
 
LeeChange :
还请多指教两个小问题,我头都昏了,没有试成功:
1、我想把你的改为函数,已部分改成功了;
2、函数返回为True或False,我想只要找到一个解的时候就 退出 ,且函数返回True,否则False,这个函数的返回值Result我始终没有找到加到哪儿,还有就是退出。
能不能麻烦你再看看呀,谢谢了!
 
算法很简单:从一个数组W中取出N个数,使之和等于一个指定的数S。
楼主的题目是这个意思吧?
另外,数组w是否为整形数组?是否有负数?
 
LeeChange:
是的,是这样的。w为整形数组,全部是大于0的整数。
指定和S由函数传入;
另外,W数组中的Max(w)<=S;并且w我已经从大到小排好序了的。
N的个数不一定,取值应该为:1....N,直到满足和S为止。
只要有一个解决方案的和为S,则退出,函数返回为True,否则返回False.
再次表示 感谢!
 
function GetSum(const S: Integer;
const W: array of Integer): Boolean;
const
BufLen = 10000;
type
TNode = record
Sum: Integer;
d: Integer;
Father: Integer
end;
var
List: array [1..BufLen] of TNode;
Close, Open: Integer;
i, k: Integer;
Sum: Integer;
Len: Integer;
begin
Len:=Length(W);
FillChar(List[1], SizeOf(TNode), 0);
Close:=0;
Open:=1;
repeat
Inc(Close);
for i:=List[Close].d+1 to Lendo
begin
Sum:=List[Close].Sum+W[i-1];
if Sum=S then
begin
Write(S, '=', W[i-1]);
k:=Close;
while k<>1do
begin
Write('+', W[List[k].d-1]);
k:=List[k].Father
end;
Result:=True;
Exit
end
else
if (Sum<S) and (Open<BufLen) then
begin
Inc(Open);
List[Open].Sum:=Sum;
List[Open].d:=i;
List[Open].Father:=Close
end
end
until (Close=Open) or (Open=BufLen);
Result:=False
end;
 
谢谢了,LeeChange,谢谢你的热心帮助。
另外,我也将你http://www.delphibbs.com/delphibbs/dispq.asp?lid=2293872 这个帖子上的测试了下,但目前没有找到好的方法来测试两种方法的效率,不知道哪一种的效率更高?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
767
import
I
I
回复
0
查看
645
import
I
后退
顶部