Тут у меня одна задачка которую никак не могу решить уже целую неделю. Главное не могу определиться с алгоритмом. Прошу вас помочь если сможете конечно. И так задано N чисел и требуеться найти минимальное число которое невозможно составить из сумм каких-либо заданных чисел. Но каждое заданное число можно использовать максимум один раз, т.е. можно и какое-то не использовать. Допустим если задано 1, 2, 4, 9, 100 то ответ будет 8. потому что 3 не может быть ответом так как 2+1=3, 5 тоже нет т.к. 4+1=5, и 7 т.к. 4+2+1=7, а вот 8 никак не получиться.
вот моя прога но она не совсем правильна.
var
n,i,j:byte;
d:array [1..100] of longint;
cem:qword;
begin
readln(n);
for i:=1 to n do read(d[i]);
if d[1]>1 then begin writeln(1); exit; end;
i:=0;
repeat
inc(i); cem:=0;
for j:=1 to i do cem:=cem+d[j];
if cem+1<d[i+1] then begin writeln(cem+1); exit; end;
until cem+1<d[i+1];
end.
есть идея, тока она очень бредовая....
Заводишь массив, сортируешь, складываешь первые 2, если их сумма меньше след элемента, то его и выводишь,
если нет, то первый и 3-й, потом 4-й и 1-й, и так пока не найдешь или не будет конец массива....
Bard, у тебя алгоритм правильный.
Добавь условие выхода из цикла на случай, если ответ равен сумме всех чисел + 1. (т.е. на случай, когда cem+1<d[i+1] не выполнится никогда).
Твое решение можно ускорить: не считай сумму каждый раз, вместо этого накапливай ее в одной переменной.
Client, спасибо за помощь но помоему я сделал тоже самое . Не всегда правильно где-то есть ошибка а наверняка и алгоритм получше есть .
Ограничения есть? На скорость выполнения, например? Если нет (и максимальное число в списке из N чисел не превосходит 255) - то можно чуть-чуть переработать вот это: http://forum.pascal.net.ru/index.php?s=&showtopic=6327&view=findpost&p=47388 и на приведенных тобой данных это выдаст правильный результат (проверил только что)...
Если есть ограничения - то говори, какие - ибо там рекурсия, соответственно о высокой скорости речи быть не может, и память будет жрать...
volvo, я просмотрел ту ссылку и все понял, но осталось только одно. ведь каждое число разрешается использовать только один раз. как мне это сделать?
Bard, я же тебе сказал, твой алгоритм - правильный. И сказал, что нужно подправить. И спросил, на каком примере у тебя не работает. Ты меня игнорируешь?
Bard, можешь побольше примеров привести?
To Bard: вот так, например (сразу говорю, реализация очень неэффективна - только для ознакомительных целей, по заданным критериям явно не будет проходить, лучше доработай свой - там совсем немного осталось)
test_01.pas ( 949 байт )
Кол-во скачиваний: 523
эта здача с http://acm.timus.ru/problem.aspx?space=1&num=1515. я вот посылаю и проходит всего 3 теста ну вот поэтому я не знаю где у меня не проходит.
Все наконец-то ... Огромное тебе спасибо Michael_Rybak . Извини что сразу не послушал , просто хотелось побольше идей ...
а вот и код программы:
1515.pas ( 398 байт )
Кол-во скачиваний: 499
Вот и отлично Поздравляю
Bard, а если вводиться 1 2 9 4 100 ответ тоже должен быть 8??
Client, там числа по возрастанию отсортированы.