История изменений
Исправление
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.
ответ.