Задача о дробном рюкзаке в 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++ относится к поиску способа наполнить сумку предметами заданного веса и прибыли таким образом, чтобы в сумке содержалось максимальное значение, не превышая максимального предела. Этого можно достичь с помощью жадного подхода, целью которого является сделать идеальный выбор на каждом этапе, ведущий к идеальному решению в конце.