Как решить задачу о дробном рюкзаке на C++

Kak Resit Zadacu O Drobnom Rukzake Na C



Задача о дробном рюкзаке в C++ относится к поиску способа наполнить сумку предметами заданного веса и прибыли таким образом, чтобы в сумке содержалось максимальное значение, не превышая максимального предела.

Как решить задачу о дробном рюкзаке на C++

Учитывая набор предметов, каждый с заданным весом и прибылью, определите каждое количество предметов в такой комбинации, чтобы общий вес предметов был меньше максимального предела мешка, но значение должно сохраняться как можно большим.







Алгоритм реализации задачи о дробном рюкзаке

Функционирование алгоритма Knapsack можно понять по следующим пунктам:



  • Возьмем два массива веса и прибыли.
  • Установите максимальное значение мешка на W.
  • Определите плотность, взяв соотношение обоих параметров.
  • Отсортируйте предметы в порядке убывания плотности.
  • Складывайте значения, пока не станет <=W.

Жадный подход к решению задачи о дробном рюкзаке

Жадный подход направлен на то, чтобы сделать идеальный выбор на каждом этапе, ведущий к идеальному решению в конце. Он решает проблемы шаг за шагом, приводя к выводам, а не подводит итоги только в конце. Это исходный код реализации решения задачи о дробном рюкзаке на C++:



#include

с использованием пространство имен стандартный ;

структура Объект {

интервал стоимость, вес ;


Объект ( интервал ценить, интервал масса )
: ценить ( ценить ) , масса ( масса )
{
}


} ;

логическое значение cmp ( структура Объект х, структура Объект y )

{

двойной А1 '=' ( двойной ) Икс. ценить / Икс. масса ;

двойной А2 '=' ( двойной ) и. ценить / и. масса ;

возвращаться А1 > А2 ;

}

двойной дробныйРюкзак ( структура Объект обр. [ ] ,
интервал В, интервал размер )
{

Сортировать ( обр, обр + размер, см.м.п. ) ;


интервал curWeight '=' 0 ;

двойной окончательное значение '=' 0,0 ;


для ( интервал я '=' 0 ; я < размер ; я ++ ) {

если ( curWeight + обр. [ я ] . масса <= В ) {
curWeight + '=' обр. [ я ] . масса ;
окончательное значение + '=' обр. [ я ] . ценить ;
}


еще {
интервал оставаться '=' В - curWeight ;
окончательное значение + '=' обр. [ я ] . ценить
* ( ( двойной ) оставаться
/ обр. [ я ] . масса ) ;

перерыв ;
}
}

возвращаться окончательное значение ;


}

интервал в '=' 60 ;


Объект обр. [ ] '=' { { 100 , двадцать } ,
{ 380 , 40 } ,
{ 140 , 10 } ,
{ 180 , 30 } } ;

интервал размер '=' размер ( обр. ) / размер ( обр. [ 0 ] ) ;


расчет << 'Максимальная прибыль = '

<< дробныйРюкзак ( обр, v, размер ) ;

возвращаться 0 ;

}

В этом коде определяется объектная структура, в которой хранятся значения веса и прибыли. bool cmp() используется для сравнения двух объектов на основе соотношения веса и ценности двух объектов. Массив расположен в порядке убывания, и значение продолжает прибавляться, пока не достигнет максимума. Если текущее значение допустимо и находится в пределах лимита, оно добавляется, в противном случае в сумку добавляется его уменьшенное соотношение. Величина веса и стоимости вводится в основной код, а на выходе печатается максимальная прибыль.





Максимальная прибыль, которая была сохранена в снэке, равна 580.



Заключение

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