ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

С++ Многомерный ранец
  #1  
Старый 19.12.2009, 23:15
lamer811
Новичок
Регистрация: 08.11.2009
Сообщений: 21
Провел на форуме:
518630

Репутация: 7
Unhappy С++ Многомерный ранец

Всем привет
Пытаюсь реализовать Многомерный ранец.
Смысл в том, что у нас есть портфель (или коробка, грузовик и т.д) и нам нужно сложить в него предметы таким образом, чтобы была получена максимальная ценность предметов
И должно быть 2 ограничения... Я сделал одномерный с одним ограничением... как добавить ещо одно?
У меня макс. вес... Нужно например добавить ограничение по объёму

Вот код:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   // wts - массив весов, cost - массив стоимостей предметов, W - вместимость рюкзак
   
   vector<int> wts; // - вектор весов

   vector<int> cost; // - вектор - стоимостей

   int W, i; // число - вместимость

   size_t n;  // - количество предметов

   String otvet; // - ответ

    //Ввод данных
    n = StrToIntDef(Edit1->Text, 0);
    if (n == 0)
    {
        ShowMessage("Не задано количество предметов");
        exit;
    }

    // заполняем веса предметов
    for (size_t i = 1; i <= n; i++)
      wts.push_back(StrToIntDef(StringGrid1->Cells[1][i], 0));

    // заполняем стоимости предметов
    for (size_t i = 1; i <= n; i++)
      cost.push_back(StrToIntDef(StringGrid1->Cells[2][i], 0));

    W = StrToIntDef(Edit2->Text, 0);  // масса рюкзака

    if (W == 0)
    {
        ShowMessage("Не задан максимальный вес ранца");
        exit;
    }

   otvet = "В ранец необходимо поместить предметы: ";

   vector<vector<int> > dp(W + 1); // - это вектор-векторов, т.е. двойной массив

   // инициализация вектора
   for (int i = 0; i <= W; i++)
	{
		dp[i].resize(n + 1); // - изменяет количество элементов в векторе
		dp[i][0] = 0;
	}

	for (size_t i = 0; i <= n; i++)
	{
		dp[0][i] = 0; // - заполняем нулями первую строку
	}

   // - два цикла динамического программирования
	for (size_t j = 1; j <= n; j++)
	{
		for (int w = 1; w <= W; w++)
		{
			if (wts[j-1] <= w)
			{
				dp[w][j] = max(dp[w][j - 1], dp[w - wts[j-1]][j - 1] + cost[j-1]);
			} else
			{
				dp[w][j] = dp[w][j - 1];
			}
		}
	}

   otvet = "Максимальная стоимость: " + IntToStr(dp[W][n]);
   
   Memo1->Lines->Add(otvet);
}
А если кто то уже сам делал на С++ поделитесь плиз
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
многомерный массив barnaki PHP, PERL, MySQL, JavaScript 8 24.01.2009 22:04



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ