Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 12:09   #1
Mollerat
Пользователь
 
Аватар для Mollerat
 
Регистрация: 11.03.2009
Сообщений: 25
По умолчанию Задача с весом на Delphi.

Товарищи помогите с такой задачей:

Имеются 10 гирь весом а1, а2. ... ,а10. Обозначим через Сk число способов, которыми можно составить вес k, т.е. Ck - это число решений уравнения.
a1x1+a2x2+…+a10x10=k, где х, может принимать значения 0 или 1 ( i= 1, ... 10 ). Получить С0, С1,..., С10.

Как её решить в Delphi?
Mollerat вне форума Ответить с цитированием
Старый 17.03.2009, 12:12   #2
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

ты с начала на бумажке напиши а не делфи это 4 минуты .... Главное понимать что ты хочешь ...
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 17.03.2009, 12:56   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как её решить в Delphi?
Ну достаточно простого перебора гирь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2009, 14:25   #4
Mollerat
Пользователь
 
Аватар для Mollerat
 
Регистрация: 11.03.2009
Сообщений: 25
По умолчанию

Я сам запуталься в условии.Мне не понятно что сдесь вводится а что должны получить. К примеру Сk, оно вводиться, или вводим k а находим C? Я ток знаю что вводим вес, а1, а2. ... ,а10, используя StringGrid.
Mollerat вне форума Ответить с цитированием
Старый 17.03.2009, 21:18   #5
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
Подмигивание

Входные данные: a_i (i=1..n), k;
Выходные данные: C_k;
Анализ: если вес k менее a_1 (пологаю, наименшее), то число вариантов 0. Если устраивать перебор, то необходимо обратить внимание на всяческие оптимизации перебора.
Идея: Положим, мы выбираем набор гирь и уже выбрали некоторое количество гирь. Тогда попробуем выбрать очередную гирю из оставшихся так, чтобы в итоге можно было бы собрать массу k. Тогда масса выбранной гири + масса уже выбранных должна быть меньше либо равна k.
Для того, чтобы не перебирать несколько вариантов одинаковых пару раз (порядок выбора гирь ведь нам не важен), можно на каждом последующем этапе выбирать гири, большие по весу всех уже выбранных.
Схематически это будет так:
Код:
procedure Step(m,lastselected:integer); {процедура выбора гири}
var i:integer; {счетчик для перебора гирь}
begin
i:=lastselected+1; {начинаем с самой легкой, которая тяжелее самой тяжелой из выбранных}
while (i<=n) and (m+a[i]<=k) do {условие оговорено}
        if m+a[i]=k then inc(Ck) else {увеличиваем Ck, если один вариант найден}
          Step(m+a[i],i); {в противном случае запускаем процедуру для следующей после этой выбранной гири}
end;
И вызывать из кода
Код:
Ck:=0; Step(0,0);
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача в Delphi Milashka Помощь студентам 1 28.12.2008 23:22
Задача на Delphi Stalkon Помощь студентам 9 15.11.2008 18:48
Файловый вирус на делфи весом 2357 байт execom Софт 19 24.10.2008 02:36
Задача на Delphi Gorinicher Помощь студентам 17 22.10.2007 21:49