| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 28.12.2002
Сообщения: 178
![]() |
Нужна программа (исходник, желательно на си или паскале) решающая задачу о рюкзаке:
X=(1,2,3,...,N), A принадлежит множеству {0, 1}; sum(X[i]*a[i])=s; Найти подпоследовательности размерности K (K<=N), сумма которых была бы равной S. Помогите пожалуйста, а то экзамен завалю!!! |
|
|
|
|
# 4 |
|
Junior Member
Регистрация: 28.12.2002
Сообщения: 178
![]() |
Вот по-другому:
Алгоритм решает задачу о рюкзаке, которая формулируется так: дан, упорядоченный по неубыванию, массив A вещественных положительных чисел и некоторое Sum, необходимо найти все подпоследовательности массива A, сумма элементов которых равна в точности Sum. В результате работы алгоритма получаем переменную L равную количеству найденых последовательностей. Сами последовательности помещаются в масcив строк Results, каждая строка представляет номера элементов массива A, разделенные запятыми. В нете много ссылок на алгоритмы, а самой проги нет ![]() Вот ссылка, например: http://alglib.manual.ru/combinatorial/backpack.php Вот ещё кое-что: http://www.isu.ru/~slava/teach/school/comb_ret.htm Просто сам уже не успеваю прогу написать, теории учить ещё до фига! Если чё, я в асе: 86835583 Можно, чтобы она(прога) работала по неоптимальному алгоритму, главное, чтобы работала и была не слишком запутана! |
|
|
|
|
# 5 |
|
::VIP::
Отыпный Саводод Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Andy1
Задача о рюкзаке немного отличается от описанной тобой задачи. Задача о рюкзаке: Есть некоторое количество предметов, которые можно уложить в рюкзак. Для каждого предмета указан коэффициент полезности и его объем. Собрать рюкзак так, чтобы объем предметов не превышал указанный объем рюкзака и суммарная полезность предметов была максимальной.
__________________
The Information will be FREE! |
|
|
|
|
# 6 |
|
::VIP::
Отыпный Саводод Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
За неимением Pascal'я код на VisualBasic'е ...
Код:
Public Sub Main()
' Определение переменных и заполнение массивов
Dim X(), A() As Byte
Dim Res() As String
Dim N, Sum, tSum, I As Byte
N = 5 ' n - размерность массива (последовательности)
ReDim X(N) ' X() - массив (последовательность) чисел
ReDim A(N) ' A() - принимает значени 0 или 1 взависимости от того, входит данный элемент в сумму или нет
ReDim Res(2 ^ N) ' Res() - результирующие последовательности
' заполняем массив произвольным образом
X(1) = 1 : X(2) = 2 : X(3) = 2 : X(4) = 3 : X(5) = 3
Sum = 6 ' s - сумма
' вводные данные закончились, теперь расчет
A(1) = 0 : A(2) = 0 : A(3) = 0 : A(4) = 0 : A(5) = 0
tSum = 0
If tSum = Sum Then
Call Save(Res, A, N)
End If
For I = 1 To N
A(I) = 1
Call Summ(Sum, tSum, I, X, A, Res, N)
A(1) = 0 : A(2) = 0 : A(3) = 0 : A(4) = 0 : A(5) = 0
Next
I = 1
While Len(Res(I)) > 0 And I <= 2 ^ N
MsgBox(Res(I))
I = I + 1
End While
End Sub
Public Sub Main()
' Определение переменных и заполнение массивов
Dim X(), A() As Byte
Dim Res() As String
Dim N, Sum, tSum, I, Count As Byte
N = 5 ' n - размерность массива (последовательности)
ReDim X(N) ' X() - массив (последовательность) чисел
ReDim A(N) ' A() - принимает значени 0 или 1 взависимости от того, входит данный элемент в сумму или нет
ReDim Res(2 ^ N) ' Res() - результирующие последовательности
' заполняем массив произвольным образом
X(1) = 1 : X(2) = 2 : X(3) = 2 : X(4) = 3 : X(5) = 3
Sum = 6 ' s - сумма
' вводные данные закончились, теперь расчет
Count = 0
A(1) = 0 : A(2) = 0 : A(3) = 0 : A(4) = 0 : A(5) = 0
tSum = 0
If tSum = Sum Then
Count = Count + 1
Call Save(Res, A, N)
End If
For I = 1 To N
A(I) = 1
Call Summ(Sum, tSum, I, X, A, Res, N, Count)
A(1) = 0 : A(2) = 0 : A(3) = 0 : A(4) = 0 : A(5) = 0
Next
MsgBox(Trim(Str(Count)))
I = 1
While Len(Res(I)) > 0 And I <= 2 ^ N
MsgBox(Res(I))
I = I + 1
End While
End Sub
Public Sub Summ(ByVal Sum As Byte, ByVal tSum As Byte, ByVal tI As Byte, ByVal X() As Byte, ByRef A() As Byte, ByRef Res() As String, ByVal N As Byte, ByRef Count As Byte)
Dim ttSum As Byte
Dim sI As Byte
ttSum = tSum + X(tI)
If ttSum < Sum Then
For sI = tI + 1 To N
A(sI) = 1
Call Summ(Sum, ttSum, sI, X, A, Res, N, Count)
A(sI) = 0
Next
ElseIf ttSum = Sum Then
Count = Count + 1
Call Save(Res, A, N)
Else
A(tI) = 0
End If
End Sub
Public Sub Save(ByRef Res() As String, ByVal A() As Byte, ByVal N As Byte)
Dim Max_I, tI As Byte
For tI = 1 To 2 ^ N
If Len(Trim(Res(tI))) = 0 Then
Max_I = tI
Exit For
End If
Next
Res(Max_I) = "{"
For tI = 1 To N
If A(tI) = 1 Then
If tI > 1 And Len(Res(Max_I)) > 1 Then
Res(Max_I) = Res(Max_I) & ","
End If
Res(Max_I) = Res(Max_I) & Trim(Str(tI))
End If
Next
Res(Max_I) = Res(Max_I) & "}"
End Sub
__________________
The Information will be FREE! |
|
|
|
|
# 7 |
|
::VIP::
Отыпный Саводод Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Pascal последний раз юзал лет 6-7 назад, поэтому не судите строго
![]() Код:
uses crt;
const n=5;
const nn=32; {nn=2^n}
function stepen(x,y : integer) : integer;
begin
if y=0 then
stepen:=1
else
if y=1 then
stepen:=x
else
begin
y:=y-1;
stepen:=x*stepen(x,y);
end;
end;
procedure save(var res : array of string; a : array of integer);
var max_i, ti : integer;
zz : string;
begin
max_i:=0;
for ti:=0 to stepen(2,n)-1 do
if (length(res[ti])=0) and (max_i=0) then
max_i:=ti;
res[max_i]:='{';
for ti:=0 to n-1 do
if a[ti]=1 then
begin
if (ti>0) and (length(res[max_i])>1) then
res[max_i]:=res[max_i]+',';
str(ti+1,zz);
res[max_i]:=res[max_i]+zz;
end;
res[max_i]:=res[max_i]+'}';
end;
procedure summ(sum,tsum,ti : integer; var count : integer;x:array of integer;var a:array of integer;var res:array of string);
var ttsum, si : integer;
zz : string;
begin
ttsum:=tsum+x[ti];
if ttsum<sum then
for si:=ti+1 to n-1 do
begin
a[si]:=1;
summ(sum,ttsum,si,count,x,a,res);
a[si]:=0;
end
else
if ttsum=sum then
begin
count:=count+1;
save(res,a);
end
else
a[ti]:=0;
end;
var sum, tsum, i, count : integer;
zz : string;
x, a : array[0..n-1] of integer;
res : array[0..nn-1] of string;
begin
clrscr;
x[0]:=1; x[1]:=2; x[2]:=2; x[3]:=3; x[4]:=3;
sum:=6;
count:=0;
a[0]:=0; a[1]:=0; a[2]:=0; a[3]:=0; a[4]:=0;
tsum:=0;
if tsum=sum then
begin
count:=count+1;
save(res,a);
end;
for i:=0 to n-1 do
begin
a[i]:=1;
summ(sum,tsum,i,count,x,a,res);
a[0]:=0; a[1]:=0; a[2]:=0; a[3]:=0; a[4]:=0;
end;
writeln;
str(count,zz);
writeln('Count of SubArrays = '+zz);
i:=1;
if count>0 then
writeln;
for i:=1 to count do
begin
writeln(res[i]);
end;
readkey;
end.
__________________
The Information will be FREE! Последний раз редактировалось SwiMMeR; 29.06.2004 в 14:41. |
|
|
|
|
# 13 | |
|
Guest
Сообщения: n/a
|
Цитата:
Имнсхо, твоя задача NPC. Так что не стесняйся полного перебора, принципиально лучшего алгоритма нет
|
|
|
|
# 14 | |
|
::VIP::
Отыпный Саводод Регистрация: 27.10.2002
Адрес: Краснодар, Россия
Пол: Male
Сообщения: 452
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
dmkr
Полный перебор не подходит, т.к. не соответствует условиям задачи ... незря ведь там сказано Цитата:
__________________
The Information will be FREE! |
|
|
|