LINUX.ORG.RU

История изменений

Исправление qulinxao, (текущая версия) :

var  w:array[0..20] of longint;o,n,s:longint;

массив w - веса, o-наилучшее приближение к половине, n- число предметов, s - сумма всех предметов

procedure F(u,t:longint);var i:longint;begin

F перебор где u - номер выбранного предмета (имено поэтому w от нуля). t - аккумулированная сумма набранных предметов. i - переменая цикла для перебора.

inc(t,w[u]);

добавили u предмет в набор

 if 2*t>=s then begin i:=2*t-s;if i<o then o:=i;exit;end;

если набор не меньше полусуммы дальше добавлять предметы бес мысленно, так что обновляем если надо наилучшее решение и возвращаемся.

 for i:=u+1 to n do 
   F(i,t);
end;

какой следующий предмет будет выбран(будь необходимость(дальнейшая заточка) то цикл можно и не до n а до такого k <=n где t+s[k...n] отклоняется от полусуммы больше чем на o - но на 20 камнях это не нужно). предпочитаю при переборе такой цикл ( мы выбираем какой камень попадает в набор) - чем вариант когда мы идём по каждому разряду вектора(брать/небрать) и делаем 2 ветки рекурсии - такой вариант ровно в 2 раза медленей чем через цикл где мы выбираем сразу с каким номером следующий камень(платя(вообще то можно было u использовать while(true)begin inc(u)if(u>n)then break;F(u,t);end;) за это местом для переменной цикла на стеке)

var i,j:longint;

локальные переменые для дубовой квадратичной сортировки

begin
read(n);w[0]:=0;
s:=0;for i:=1 to n do begin read(w[i]);inc(s,w[i]);end;

читаем набор, и запоминаем его сумму.

for i:=1 to n-1 do
  for j:=i+1 to n do
    if w[i]<w[j] then begin o:=w[i];w[i]:=w[j];w[j]:=o;end;
o:=s;

сортируем , и в качестве первого приближения берём решение когда все камни в наборе.

F(0,0);

выбираем несуществующий камень.

writeln(o);
end.

ответ.

Исправление qulinxao, :

var  w:array[0..20] of longint;o,n,s:longint;

массив w - веса, o-наилучшее приближение к половине, n- число предметов, s - сумма всех предметов

procedure F(u,t:longint);var i:longint;begin

F перебор где u - номер выбранного предмета (имено поэтому w от нуля). t - аккумулированная сумма набранных предметов. i - переменая цикла для перебора.

inc(t,w[u]);

добавили u предмет в набор

 if 2*t>=s then begin i:=2*t-s;if i<o then o:=i;exit;end;

если набор не меньше полусуммы дальше добавлять предметы бес мысленно, так что обновляем если надо наилучшее решение и возвращаемся.

 for i:=u+1 to n do 
   F(i,t);
end;

какой следующий предмет будет выбран(будь необходимость(дальнейшая заточка) то цикл можно и не до n а до такого k <=n где t+s[k...n] отклоняется от полусуммы больше чем на o - но на 20 камнях это не нужно). предпочитаю при переборе такой цикл ( мы выбираем какой камень попадает в набор) - чем вариант когда мы идём по каждому разряду вектора(брать/небрать) и делаем 2 ветки рекурсии - такой вариант ровно в 2 раза медленей чем через цикл где мы выбираем сразу с каким номером следующий камень(платя(вообще то можно было u использовать if(u<n)then repeat inc(u);F(u,t);until u=n;) за это местом для переменной цикла на стеке)

var i,j:longint;

локальные переменые для дубовой квадратичной сортировки

begin
read(n);w[0]:=0;
s:=0;for i:=1 to n do begin read(w[i]);inc(s,w[i]);end;

читаем набор, и запоминаем его сумму.

for i:=1 to n-1 do
  for j:=i+1 to n do
    if w[i]<w[j] then begin o:=w[i];w[i]:=w[j];w[j]:=o;end;
o:=s;

сортируем , и в качестве первого приближения берём решение когда все камни в наборе.

F(0,0);

выбираем несуществующий камень.

writeln(o);
end.

ответ.

Исправление qulinxao, :

var  w:array[0..20] of longint;o,n,s:longint;

массив w - веса, o-наилучшее приближение к половине, n- число предметов, s - сумма всех предметов

procedure F(u,t:longint);var i:longint;begin

F перебор где u - номер выбранного предмета (имено поэтому w от нуля). t - аккумулированная сумма набранных предметов. i - переменая цикла для перебора.

inc(t,w[u]);

добавили u предмет в набор

 if 2*t>=s then begin i:=2*t-s;if i<o then o:=i;exit;end;

если набор не меньше полусуммы дальше добавлять предметы бес мысленно, так что обновляем если надо наилучшее решение и возвращаемся.

 for i:=u+1 to n do 
   F(i,t);
end;

какой следующий предмет будет выбран(будь необходимость(дальнейшая заточка) то цикл можно и не до n а до такого k <=n где t+s[k...n] отклоняется от полусуммы больше чем на o - но на 20 камнях это не нужно). предпочитаю при переборе такой цикл ( мы выбираем какой камень попадает в набор) - чем вариант когда мы идём по каждому разряду вектора(брать/небрать) и делаем 2 ветки рекурсии - такой вариант ровно в 2 раза медленей чем через цикл где мы выбираем сразу с каким номером следующий камень(платя(вообще то можно было u использовать repeat inc(u);F(u,t);until u=n;) за это местом для переменной цикла на стеке)

var i,j:longint;

локальные переменые для дубовой квадратичной сортировки

begin
read(n);w[0]:=0;
s:=0;for i:=1 to n do begin read(w[i]);inc(s,w[i]);end;

читаем набор, и запоминаем его сумму.

for i:=1 to n-1 do
  for j:=i+1 to n do
    if w[i]<w[j] then begin o:=w[i];w[i]:=w[j];w[j]:=o;end;
o:=s;

сортируем , и в качестве первого приближения берём решение когда все камни в наборе.

F(0,0);

выбираем несуществующий камень.

writeln(o);
end.

ответ.

Исправление qulinxao, :

var  w:array[0..20] of longint;o,n,s:longint;

массив w - веса, o-наилучшее приближение к половине, n- число предметов, s - сумма всех предметов

procedure F(u,t:longint);var i:longint;begin

F перебор где u - номер выбранного предмета (имено поэтому w от нуля). t - аккумулированная сумма набранных предметов. i - переменая цикла для перебора.

inc(t,w[u]);

добавили u предмет в набор

 if 2*t>=s then begin i:=2*t-s;if i<o then o:=i;exit;end;

если набор не меньше полусуммы дальше добавлять предметы бес мысленно, так что обновляем если надо наилучшее решение и возвращаемся.

 for i:=u+1 to n do 
   F(i,t);
end;

какой следующий предмет будет выбран(будь необходимость(дальнейшая заточка) то цикл можно и не до n а до такого k <=n где t+s[k...n] отклоняется от полусуммы больше чем на o - но на 20 камнях это не нужно). предпочитаю при переборе такой цикл ( мы выбираем какой камень попадает в набор) - чем вариант когда мы идём по каждому разряду вектора(брать/небрать) и делаем 2 ветки рекурсии - такой вариант ровно в 2 раза медленей чем через цикл где мы выбираем сразу с каким номером следующий камень(платя(вообще то можно было u использовать repeat inc(u);F(u,t);until u<n;) за это местом для переменной цикла на стеке)

var i,j:longint;

локальные переменые для дубовой квадратичной сортировки

begin
read(n);w[0]:=0;
s:=0;for i:=1 to n do begin read(w[i]);inc(s,w[i]);end;

читаем набор, и запоминаем его сумму.

for i:=1 to n-1 do
  for j:=i+1 to n do
    if w[i]<w[j] then begin o:=w[i];w[i]:=w[j];w[j]:=o;end;
o:=s;

сортируем , и в качестве первого приближения берём решение когда все камни в наборе.

F(0,0);

выбираем несуществующий камень.

writeln(o);
end.

ответ.

Исходная версия qulinxao, :

это объяснение для твоего питон-варианта. 1005

var  w:array[0..20] of longint;o,n,s:longint;

массив w - веса, o-наилучшее приближение к половине, n- число предметов, s - сумма всех предметов

procedure F(u,t:longint);var i:longint;begin

F перебор где u - номер выбранного предмета (имено поэтому w от нуля). t - аккумулированная сумма набранных предметов. i - переменая цикла для перебора.

inc(t,w[u]);

добавили u предмет в набор

 if 2*t>=s then begin i:=2*t-s;if i<o then o:=i;exit;end;

если набор не меньше полусуммы дальше добавлять предметы бес мысленно, так что обновляем если надо наилучшее решение и возвращаемся.

 for i:=u+1 to n do 
   F(i,t);
end;

какой следующий предмет будет выбран(будь необходимость(дальнейшая заточка) то цикл можно и не до n а до такого k <=n где t+s[k...n] отклоняется от полусуммы больше чем на o - но на 20 камнях это не нужно). предпочитаю при переборе такой цикл ( мы выбираем какой камень попадает в набор) - чем вариант когда мы идём по каждому разряду вектора(брать/небрать) и делаем 2 ветки рекурсии - такой вариант ровно в 2 раза медленей чем через цикл где мы выбираем сразу с каким номером следующий камень(платя(вообще то можно было u использовать repeat inc(u);F(u,t);until u=n;) за это местом для переменной цикла на стеке)

var i,j:longint;

локальные переменые для дубовой квадратичной сортировки

begin
read(n);w[0]:=0;
s:=0;for i:=1 to n do begin read(w[i]);inc(s,w[i]);end;

читаем набор, и запоминаем его сумму.

for i:=1 to n-1 do
  for j:=i+1 to n do
    if w[i]<w[j] then begin o:=w[i];w[i]:=w[j];w[j]:=o;end;
o:=s;

сортируем , и в качестве первого приближения берём решение когда все камни в наборе.

F(0,0);

выбираем несуществующий камень.

writeln(o);
end.

ответ.