Другие языки программирования и технологии

Помогите найти ошибку в решении олимпиадной задаче...

1087. Время забирать камни
Ограничение времени: 1.0 секунды
Ограничение памяти: 16 МБ
Вероятно, вы знаете игру, в которой два участника по очереди берут из кучки от 1 до 3 камней, и проигрывает тот, кто взял последний камень. Мы немного обобщим эту задачу: будем считать, что оба игрока могут брать не по 1, 2, 3 камня, а по k1, k2, …, km камней. Нас опять будет интересовать вопрос, кто из игроков выигрывает при правильной игре. Гарантируется, что вне зависимости от уже сделанных игроками ходов, всегда возможно сделать очередной ход.
Исходные данные
В первой строке даны числа n и m (1 ≤ n ≤ 10000; 1 ≤ m ≤ 50) — начальное количество камней в кучке и количество чисел k1, …, km. Во второй строке через пробел находятся числа k1, …, km (1 ≤ ki ≤ n).
Результат
Выведите число 1, если при правильной игре обоих выигрывает первый игрок (первым берущий камни) . Иначе выведите число 2.
http://acm.timus.ru/problem.aspx?space=1&num=1087
Моё решение:
Program z1;
var
win:array[0..10000]of integer;
k:array[1..50]of integer;
i,j,n,m:integer;
begin
readln(n,m);
win[0]:=0;
for i:=1 to m do readln(k);
For i:=1 to n do begin
for j:=1 to m do begin
if i-k[j]>=0 then
if win[i-k[j]]=0 then
win:=1;
end;
end;
if win[n]=1 then writeln('2') else writeln('1');
readln;
end.

Компилятор в тимусе выдаёт ошибку, но я никак не могу понять, что неверно (
Алгоритм тут такой: создаем массив по размеру кучи. Последний элемент ставим на значение "проигрыш" (например, 0). Для каждого из предыдущих по одному проверяем, можно ли из него перейти в ячейку со значением "проигрыш" (т. е. подставить противника) . Если можно - ставим "выигрыш" (1). Если нельзя - ставим "проигрыш". И т. д. А потом просто проверяем значение первой ячейки.
Что же до ошибки компилятора, выложи код на pastebin.com, а то ответы, как всегда, пожевали код.
Игорь Аверин
Игорь Аверин
65 823
Лучший ответ
всегда должен выигрывать второй игрок.
Ей-богу, и читать вашу программу неинтересно, потому что вы идею алгоритма не изложили.
И программа ужасна тем, что нет ни одной строки комментария об алгоритме, кто Вас обучает?

Суть задачи в том, что если диапазон порции от 1 до k камней, то первый игрок должен оставить в игре после своего хода.
p*(1+k)+1 камней.
сколько бы ни взял второй, первый должен его камни дополнить до k+1.

А что это за мутное условие k1, k2, …, km камней.
В каком диапазоне? если нельзя брать 1 или 2 камня?
Программа либо должна сама автоматически сыграть игру (по алгоритму, о котором я сказала выше) , либо 2 человека должны вводить запросы, либо один человек должен играть против машины.
Если человек вводит запрос, то необходимо проверить, допускается ли такой ход

В чем идея хода выигрывающего игрока? Никакого намёка, кроме тривиального перебора циклов.

Я понимаю, что задача может носить обобщённый характер, но правила игры должны быть чётко описаны.
Как только алгоритм будет записан словесно или блочной схемой, никаких проблем с ним не будет.
Я уверена, что здесь ясное решение не должно получаться случайным перебором.
Порядок не тот.
Федор Макаров
Федор Макаров
1 045
Сергей Крятов А можно тут по-подробней?
Сергей Крятов Все выдуманные мной тесты программа проходит
readln; в конце убрали?
Сергей Крятов да, не помогло