Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приближенный алгоритм, нужна помощь 
:(
    Опции темы
Serfect
Дата 8.5.2011, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.5.2011

Репутация: нет
Всего: нет



Есть задача сумма подмножеств (кажется это Subset Sum Problem, но точно не уверена). Вот условие: 
Задано конечное множество А, положительные целые веса для каждого элемента множества А и положительный целый вес К. 
Существует ли такое подмножество множества А, что сумма весов его элементов равна К. 

Решила эту задачу точным экспоненциальным алгоритмом, а как приближенный написать не знаю. 
Вот код точного алгоритма: 
Код

#pragma hdrstop
#include <iostream.h>
//---------------------------------------------------------------------------
const unsigned int Ves=10;  // вес, который нужно набрать
unsigned int kratn[Ves]={0,3,2,1,0,0,0,1,1,0}; // разновес, показывает количество гирь определенного веса (3 гири веса 1 и т.д.)
unsigned int sol[Ves]={0}; // решение
void nabor(g,V)//g - вес последней добавленной гири, V-то, что нужно набрать
{ unsigned int V1, i=0;
  for (unsigned int i=g; i>0; i--)
      if ((kratn[i]>0)&&(i<=V))//если гиря есть в разновесе, и вес еще не набран
        { kratn[i]=kratn[i]-1; //удаляем гирю из разновеса
          sol[i]=sol[i]+1; // добавляем в решение
          V1=V-i; //новый текущий вес
          if (V1==0)
             { for (unsigned int j=0; j<Ves; j++)
                if (sol[j])  //пока не набрали нужный вес, добавляем гири в решение
                  for (unsigned int k=sol[j]; k>0; k--) cout<<j<<" ";
               cout<<endl;
             }
             else nabor(i,V1); //вызов рекурсии
          kratn[i]=kratn[i]+1;//возврат гири в разновес
          sol[i]=sol[i]-1; //удаление из решения
        }
}
#pragma argsused
int main(int argc, char* argv[])
{   nabor(Ves,Ves);
    getchar();
    return 0;
}
//---------------------------------------------------------------------------



Подскажите, пожалуйста, как написать приближенный алгоритм. 
Сказали, что нужно просто отсортировать гири и в цикле набирать вес, как только вес набран, так выходить из цикла, попробовала так сделать - не получилось.  
PM MAIL   Вверх
bsa
Дата 10.5.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Serfect, тот метод, что тебе посоветовали не может дать 100% результата. Например, есть отсортированный набор весов, искомый находится только путем суммы 3-го, 5-го и 7-го. При этом, сумма первого и второго меньше необходимой. Вопрос, как не перебирая все возможные варианты получить необходимый результат?
PM   Вверх
Serfect
Дата 14.5.2011, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.5.2011

Репутация: нет
Всего: нет



Необходимо найти набор весов максимально приближенный к заданному весу, либо равный ему, если это возможно. Получается, что идем по циклу отсортированных в порядке убывания весов, если вес первого предмета не превышает заданный, включаем его в набор, идем дальше, если вес первого предмета + вес второго меньше либо равен заданному, то добавляем второй предмет в выборку, а если их суммарный вес больше, то отбрасываем и переходим к следующему, и т.д. пока не наберем нужный вес, как только все набран (или предметы закончились) выходим из цикла. 

Правильно понимаю приближенный алгоритм?  

PM MAIL   Вверх
borisbn
Дата 14.5.2011, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Serfect, однопроходный алгоритм даёт не лучший результат. Например:
требуемый вес - 10
набор гирь - 7 5 4 1
в твоём случае выберется 7 и 1 = 8, а лучше было бы 5, 4 и 1 = 10. так ?
получается, что набрав какой-то вес, начиная с первого элемента, нужно пробовать набирать другие варианты, начиная со 2-го элемента, 3-го и т.д. И в каком случае получится ближайший к требуемому вес, такой и выбирать, а не обязательно первый. Как-то так.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 14.5.2011, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



имхо надо выходить из цикла только при достижении полного совпадения.
а пока не нашли, хранить луший вариант и искать более лучший.
Цитата(bsa @  10.5.2011,  10:24 Найти цитируемый пост)
Вопрос, как не перебирая все возможные варианты получить необходимый результат? 

а это не np-полная задача, часом?
PM MAIL   Вверх
borisbn
Дата 15.5.2011, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



> надо выходить из цикла только при
достижении полного совпадения
а если его вообще не будет?

А что такое np-полная задача?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 15.5.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(borisbn @  15.5.2011,  06:50 Найти цитируемый пост)
а если его вообще не будет?

Ну значит перебирать все варианты. Когда варианты закончатся, вывести лучший, который мы сохранили.

Цитата(borisbn @  15.5.2011,  06:50 Найти цитируемый пост)
А что такое np-полная задача? 

NP-полная задача
Своими словами, задача, решаемая только полным перебором.
Верней, пока не найдено пути решения таких задач за полиномиальное время (то есть без полного перебора).
Если кто найдет способ решить такую задачу без полного перебора, нобелевская премия по математике обеспечена. smile 
Но я не уверен, что именно эта задача сводится к np-полной.
PM MAIL   Вверх
borisbn
Дата 15.5.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



volatile, аааа. всё. понял. просто обычно большими буквами пишут P = NP...

Цитата(volatile @  15.5.2011,  11:49 Найти цитируемый пост)
нобелевская премия по математике

 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
HMLd
Дата 15.5.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: -1
Всего: 0



borisbn, не доказано, что P = NP, ровно как и P != NP.

volatile, ага, по математике))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.