Форум умных людей

Задачи и головоломки => Для программистов => Тема начата: Sirion от Июнь 28, 2012, 23:49:19



Название: Злобная задача для хитрых программистов
Отправлено: Sirion от Июнь 28, 2012, 23:49:19
Сколькими способами можно выбрать 11 натуральных чисел так, чтобы любое натуральное число от 1 до 1024 можно было представить как сумму некоторого их подмножества?


Название: Re: Злобная задача для хитрых программистов
Отправлено: zhekas от Июнь 29, 2012, 00:14:34
С повторениями?


Название: Re: Злобная задача для хитрых программистов
Отправлено: Sirion от Июнь 29, 2012, 00:16:26
Имеете в виду, могут ли среди этих 11 чисел быть одинаковые? Да, могут.


Название: Re: Злобная задача для хитрых программистов
Отправлено: zhekas от Июль 01, 2012, 13:49:27
Заканчивается обход множеств начинающихся с двух едениц. И количество уже 1627475601. Ещё на подходе множества начинающихся с 1,2. Предположительно, около 3-4 миллиардов.


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 01, 2012, 14:03:04
Неужели нет хорошего решения без длинного перебора? Или вся суть именно написать такую программу, которая адекватно переберет?


Название: Re: Злобная задача для хитрых программистов
Отправлено: moonlight от Июль 01, 2012, 16:13:42
у меня получилось приблизительно 250 млрд.


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 01, 2012, 17:36:58
извините меня малообразрванного, но я с подмножеством не понял в условии... кто-нить может "на пальцах" объяснить чего надо?


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 01, 2012, 17:57:16
Напишем наши числа на бумажках.
Для каждого натурального числа от 1 до 1024 можно так выбрать бумажки, чтобы сумма чисел на этих бумажках была равна нужному нам числу.


Название: Re: Злобная задача для хитрых программистов
Отправлено: Sirion от Июль 02, 2012, 03:01:01
250 миллиардов - довольно близко к истине
моя программа считает эту задачу где-то за минуту
и принцип её работы далёк от перебора


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 06:40:04
Сирион, ок. Тогда ничего не имею против)


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 15:12:27
я конечно дико извиняюсь, но можно хотябы 1 из 250 млрд. решение из 11 чисел. удовлетворяющим условию задачи в студию...

спасибо


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 15:53:53
вот, у меня получается так:
чтобы набрать любое от 1 до 10 нужно минимум 4 числа, а именно:
1) 1 1 3 5
2) 1 2 3 4
3) 1 2 3 5
4) 1 1 3 6
5) 1 2 3 6 наверное, еще какие-то, но пока что не в этом суть, а суть в том, что сделать это тремя цифрами не получается (во всяком случае, у меня)..
я уже не говорю о том, что цифру 1 суммой вообще набрать нельзя, разве что использовать для этого 0, но ладно, предположим, что нужное число может приравниваться условно к сумме самого себя с виртуальным нулем.

тогда имеем как минимум 4 числа, чтобы набрать десятки, и столько же, чтобы набрать сотни. итого - 12 чисел, и можем набрать любое число от 1 до 1110. мои попытки сократить количество необходимых чисел до11 пока не увенчались успехом  :tormoz:
прошу помощи  :help:


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 15:56:10
от 2^0 до 2^9 и любое из чисел от 1 до 1024


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:01:38
от 2^0 до 2^9 и любое из чисел от 1 до 1024
напиши тупо 11 чисел из которых можно выбрать числа, из суммы которых можно составить любое число от 1 до 1024


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:03:31
а! можешь написать остро!! ;)


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:06:33
может, я сложно выражаюсь? вот мой пример:
из суммы чисел (либо их подмножества) 1 2 3 4 10 20 30 40 100 200 300 400 (всего - 12) можно набрать любое число от 0 до 1110. если нужно еще 0 - тогда получается 13.

а теперь вы с 11 числами, пожалуйста


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 16:08:58
1 1 2 4 8 16 32 64 128 256 512


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:17:25
1 1 2 4 8 16 32 64 128 256 512
да, спасибо. теперь понял что ты имел ввиду степени двойки, это зачетно.

ой, а можно еще одну серию? последнюю, больше не буду приставать  :-[


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 16:21:44
меняешь единицу на любое другое число до 1024.

Да можешь сам придумывать)

Первое число - 1.
Любое последующее не больше суммы всех предыдущих и единицы.
Главное, чтобы все вместе давали не меньше 1024.

Любой такой набор удовлетворяет условиям.


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:23:42
я понял. то же, тока вместо 4 будет к примеру 5... и т.д. :yesgirl:

я не сомневался, что ответ есть... меня цифра 250 млрд. как-то усомнила...  :(


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:30:23
Первое число - 1.
Любое последующее не больше суммы всех предыдущих и единицы.
Главное, чтобы все вместе давали не меньше 1024.

Любой такой набор удовлетворяет условиям.

кстати, имхо, это уже не просто перебор, здесь бы выводящую составляющую дописать, тогда и сравнивать ненужно


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 16:34:18
нет, это почти просто перебор.
Ну т.е. он будет долго работать (2^55 циклов (меньше, но все равно)), да и нет никакой задумки хорошей.


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:39:08
интересно, а сколько времени требуется просто на вывод 250 млрд. чисел пусть с минимальным количеством операций по расчету? это же будет, ну, как минимум даже без учета рассчета, правильно?!


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 16:43:13
Зависит от языка, насколько я знаю.
Мне говорили, что на паскале 10^9 операций в секунду. т.е. 4 минуты)


Название: Re: Злобная задача для хитрых программистов
Отправлено: Smith от Июль 02, 2012, 16:50:44
Зависит от языка, насколько я знаю.
Мне говорили, что на паскале 10^9 операций в секунду. т.е. 4 минуты)

значит, у Сириона другой язык.
либо он спутал часы с минутами  :roll:


Название: Re: Злобная задача для хитрых программистов
Отправлено: Um_nik от Июль 02, 2012, 16:54:04
Ну, я почти уверен, что Сирион пишет на чем-то покруче паскаля)


Название: Re: Злобная задача для хитрых программистов
Отправлено: Sirion от Июль 02, 2012, 17:30:36
Сирион пишет на всём. В данном случае - на делфи) А при чём здесь вывод? Нужно посчитать количество, а не выводить все возможные комбинации (которые ещё не на всякий жёсткий диск влезут).


Название: Re: Злобная задача для хитрых программистов
Отправлено: zhekas от Июль 03, 2012, 22:08:49

Показать скрытый текст


Название: Re: Злобная задача для хитрых программистов
Отправлено: Sirion от Июль 03, 2012, 22:37:36
Истинная истина. Какое было решение?


Название: Re: Злобная задача для хитрых программистов
Отправлено: zhekas от Июль 03, 2012, 22:52:47
Сначала был перебор. С помощью рекурсии Podgon(n,m,k) вычислялась количество для комбинаций из n - членов, которые составлют суммы до m включительно (но m+1 уже не включают) и каждый элемент не превосходит k. В процедуре суммировались Podgon(n-1,m-i,i).

Но выполнялось это долго. Тогда я подумал что функции с одним и тем же параметрами должны повторятся при вычислении. И для n=8 записал таблицу значений a8[m][k] = Podgon(8,m,k). Уже по этой таблице нашёл a9[m][k], затем a10[m][k] и a11[m][k]


Название: Re: Злобная задача для хитрых программистов
Отправлено: Sirion от Июль 03, 2012, 22:54:08
Да, у меня точно так же)


Название: Re: Злобная задача для хитрых программистов
Отправлено: KreysaEV от Ноябрь 27, 2019, 21:42:03
В наше время понятие "хитрая задача" уже не существует). Сейчас просто полно различных ресурсов, на которых можно заказать решение задач http://2dip.su/zakazat/reshenie_zadach/ . Стоит это недорого, да и результат предоставляют в короткие сроки.