这样的算法怎么解决?(加法) (100分)

  • 主题发起人 主题发起人 duhai_lee
  • 开始时间 开始时间
D

duhai_lee

Unregistered / Unconfirmed
GUEST, unregistred user!
一MM问偶, 她有25个数(暂用A~Y表示),要求,任意个数相加得Z, 不管怎么加,但是不能让加数重复,即A~Y之间的数不能重复。我累傻了,还是不行。
大侠们帮帮我吧。
二十五个数的组合(A~Y), 使其相加得Z。 就这么简单。
算了,还是把数据写在上面吧。
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
以上任意组合相加得出390135.32这样的答案就行了。 这下明白了吧?
 
楼主的要求是否是这样的,有25个连续的整数,要求摆成以下图形:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 16 18 19 20
21 22 23 24 25
但要求每一行值累加 = 每一列值累加 = 对角线的数值累加 ?
 
用最笨的方法了.不过你说得还有点清楚.如A+B=Z和B+A=Z是不是重复呢!
 
对说清楚点。这25个数是连续的吗?这个Z是个固定的数吗?
 
作个记号!!
 
TO bes96261 :
您用的距阵,如果能实现的话,可以。
但这里不限制,怎么去加,有可能是二十五个数一起相加。
简单说,我给你二十五个数,你随意相加(但是不要出现重复的加数,加数的个数是随意的)。得出一个数,我给你的Z就行了。 然后告诉我这个算式,也就是每个加数就行了。
看了,我的叙述有很严重的问题,是这样的。 这25个数是没有相互关系的。
有可能, 是A+B+C+D=Z, 有可能是F+G+I+H=Z,能解出来就行。
A+B=Z , B+A=Z是一样的, 这是组合。
 
楼主再将问题说明白一些
 
A~Y 都是固定的, Z 也是固定的。
 
由于,那些数字太麻烦,所以没有抄在上面。 有一点肯定, 可以确定,肯定有一种组合能等于Z(若干个数相加= Z,若干个数存在于A~Y中,且不重复)
 
这个问题我不会,期待答案
 
老大是否要在a-y中寻找等于z的组合啊?
 
看了半天真不知道你要问什么?
 
To gydldfw:
对了。 就是这样的。
 
搂主没有说清楚!!!仔细一点好吗?!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
myis = set of 0..24;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dest: Extended = 390135.32;
data: array[0..23] of Extended =
(
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);
implementation
{$R *.dfm}
function ok(v: myis): boolean;
var
i: integer;
s: Extended;
begin
s := 0;
for i := 0 to 24do
if i in v then
s := s + data;
result := s = dest;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mylist: array of myis;
i: integer;
temp: myis;
begin
temp := [];
showmessage(inttostr(sizeof(temp)));
//inc(temp);
end;

end.

 
楼主的测试数据有问题,首先只提供了24个数据,并不是25个。其次,有重复的数据,比如13539.47最少出现了4次,这算同一个数还是不同的数?如果算不同的,解法如下:(我随便加了第25个数1234.56)
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.
 
用暴力的方法。一步步去做,做這個計算機最在行了。
to leechang:
是不是一上來把這25個數排一下序好一點。
排序值得嗎?是不是25個太少了。
 
To LeeChange :
您的算法完全正确, 简直棒极了。
可惜小弟不是很明白。 能否讲解一二。 对了。 我打算分全给你。
 
感谢LeeChange,
可否,简单讲解以下您的思路。小弟很是期待
 
后退
顶部