![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| liiy2008 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 18.6.2012 Репутация: нет Всего: нет |
есть N камней с массами W1, W2 , … WN. Требуется разложить камни на 2 кучки так, чтобы разница масс этих кучек была минимальной.-сама задача
вот сам код: Код Delphi program Project2; {$APPTYPE CONSOLE} uses Windows, SysUtils; Type MyMass = Array[1..18] Of Integer; Var id : DWord; i,j,m,c,n : Integer; SumW,Razn : Integer; W,ResW : MyMass; f : TextFile; //**************************************** //Нахождение суммы части элементов массива mas //максимально приближенной к значению Znach //razm-размер массива //На выход функции передаётся найденное значение //а в массиве Res - элементы, дающие эту сумму Function FindSumInMass(VAR mas,Res:MyMass;razm,Znach:Integer):Integer; var i,j,k : Integer; Temp,Temp1 : MyMass; Begin For i:=1 To 18 Do Res[i]:=0; Result:=0; If razm=1 Then //Для одного элемента Begin Result:=mas[1]; Res[1]:=mas[1]; Exit; End; If razm=2 Then //Для двух элементов Begin i:=Abs(mas[1]-Znach); j:=Abs(mas[2]-Znach); k:=Abs(mas[1]+mas[2]-Znach); If i>j Then If j<k Then Begin Result:=mas[2]; Res[1]:=mas[2]; Exit; End Else Begin Result:=mas[1]+mas[2]; Res[1]:=mas[1]; Res[2]:=mas[2]; Exit; End Else If i<k Then Begin Result:=mas[1]; Res[1]:=mas[1]; Exit; End Else Begin Result:=mas[1]+mas[2]; Res[1]:=mas[1]; Res[2]:=mas[2]; Exit; End; End; For i:=1 To razm Do Begin For j:=1 To razm-1 Do If j>=i Then Temp[j]:=mas[Succ(j)] Else Temp[j]:=mas[j]; If mas[i]<Znach Then Begin k:=Znach-mas[i]; If k=0 Then Begin Result:=mas[i]; For j:=1 To 18 Do Res[j]:=0; Res[1]:=mas[i]; Exit; End; k:=FindSumInMass(Temp,Temp1,razm-1,k); If Abs(Result-Znach)>Abs((k+mas[i])-Znach) Then Begin Result:=k+mas[i]; Res[1]:=mas[i]; For j:=1 To razm-1 Do Res[Succ(j)]:=Temp1[j]; End; End Else If Abs(Result-Znach)>(mas[i]-Znach) Then Begin Result:=mas[i]; Res[1]:=mas[i]; End; // If (Odd(SumM) And (Abs(Result-Znach)=1)) Then Exit; End; End; {FindSumInMass} Begin //Инициализируем для выдачи русского текста на экране SetConsoleCP(1251); SetConsoleOutPutCP(1251); AssignFile(f,'input.txt'); Reset(f); ReadLn(f,n); //Количество камней If ((n<1) Or (n>18)) Then Begin CloseFile(f); AssignFile(f,'output.txt'); Rewrite(f); WriteLn(f,'Не соответствует количество камней!'); CloseFile(f); Exit; End; SumW:=0; //Общая сумма веса всех камней For i:=1 To n Do Begin Read(f,W[i]); If ((W[i]<1) Or (W[i]>105)) Then Begin CloseFile(f); AssignFile(f,'output.txt'); Rewrite(f); WriteLn(f,'Не соответствует вес камней!'); CloseFile(f); Exit; End; SumW:=SumW+W[i]; //Накопить общую сумму End; CloseFile(f); AssignFile(f,'output.txt'); Rewrite(f); WriteLn; WriteLn('Выполняется обработка - ожидайте...'); id:=GetTickCount; //Запомним время начала выполнения //Раскладываем камни... c:=FindSumInMass(W,ResW,n,SumW Div 2); //Выдача на экран массивов двух куч камней... WriteLn; WriteLn('Задание выполнено!'); WriteLn('Результаты раскладки :'); m:=0; For i:=1 To n Do Begin For j:=1 To n Do If W[j]=ResW[i] Then Begin W[j]:=0; Break; End; Write(ResW[i],' '); Inc(m,ResW[i]); If m=c Then Break; End; WriteLn; //Вторая куча For i:=1 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |