Другие языки программирования и технологии
Напишите программу Pascal
Из камней весом p с индексом i (i=1,...N) требуется набрать кучу весом ровно W или, если это не возможно, максимально близкую к W (но меньшую, чем W).
А задачка интересная, можно сказать, олимпиадная. Это вариант задачи о размене.
Алгоритм сильно зависит от количества камней - N. При малом N (< 100) подойдёт любой. Но при больших - необходимо включить моск.
Для начала нужно проверить, что камней вообще хватит. То есть сложить все P[i] и сравнить с W. Иногда везёт (сумма <= W) и все камни и есть решение.
Далее необходимо построить алгоритм, который выведет ВСЕ решения. Это нужно, чтобы потом проверять написанный вами алгоритм, когда W набрать не удаётся.
Это можно сделать простым перебором. Если сделать массив признаков B[1..N] of 0..1, где B[i] - признак, что камень нужно брать. То есть суммарный вес выбранных камней: T=сумма (P[i]*B[i]). Всего таких сумм 2^N. То есть придётся использовать N*2^N сложений и умножений (теперь понятно, почему N нужно выбирать 10-20?).
Теперь почему этот перебор простой: представьте, что B[i] - это бит, тогда массив B - это целое число. При N <= 30 можно использовать не массив, а биты в числе V: LongInt. При этом B[i]:=(V shr (i -1)) and 1.
Все наборы камней перебираются при V=0..2^N-1. То есть простым циклом.
ЗЫ
Пример программы, которая это делает: http://ideone.com/g70YJK
Я знаю, как значительно сократить число перебора.
Но вы начните с сортировки набора камне и группировки одинаковых.
Алгоритм сильно зависит от количества камней - N. При малом N (< 100) подойдёт любой. Но при больших - необходимо включить моск.
Для начала нужно проверить, что камней вообще хватит. То есть сложить все P[i] и сравнить с W. Иногда везёт (сумма <= W) и все камни и есть решение.
Далее необходимо построить алгоритм, который выведет ВСЕ решения. Это нужно, чтобы потом проверять написанный вами алгоритм, когда W набрать не удаётся.
Это можно сделать простым перебором. Если сделать массив признаков B[1..N] of 0..1, где B[i] - признак, что камень нужно брать. То есть суммарный вес выбранных камней: T=сумма (P[i]*B[i]). Всего таких сумм 2^N. То есть придётся использовать N*2^N сложений и умножений (теперь понятно, почему N нужно выбирать 10-20?).
Теперь почему этот перебор простой: представьте, что B[i] - это бит, тогда массив B - это целое число. При N <= 30 можно использовать не массив, а биты в числе V: LongInt. При этом B[i]:=(V shr (i -1)) and 1.
Все наборы камней перебираются при V=0..2^N-1. То есть простым циклом.
ЗЫ
Пример программы, которая это делает: http://ideone.com/g70YJK
Я знаю, как значительно сократить число перебора.
Но вы начните с сортировки набора камне и группировки одинаковых.
За рублей 300 мб и сделаю.
Сергей Гарасюта
Разве можно такие задачи давать в школе?
Похожие вопросы
- помогите написать программу pascal
- помогите написать программу Pascal строки
- Напишите программу на Pascal. В цистерне N литров молока.
- Люди помогите написать программы для Pascal очень срочно и очень нужно
- Помогите ламеру написать программу на Pascal.
- Помогите написать программу в PASCAL!!!
- написать программу на Pascal.
- нужно написать программу в Pascal.
- Помогите написать программу в Pascal abc net
- Помогите написать программы по Pascal ABC