From 3d0a6a0a28504eab138135501ed3a3a268780fe0 Mon Sep 17 00:00:00 2001 From: Himanshu Jain <nhimanshujain@gmail.com> Date: Mon, 28 Oct 2019 12:08:18 +0530 Subject: [PATCH] Knapsack Greedy Alogrithm --- GreedyAlgorithms/Knapsack.cpp | 92 +++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 GreedyAlgorithms/Knapsack.cpp diff --git a/GreedyAlgorithms/Knapsack.cpp b/GreedyAlgorithms/Knapsack.cpp new file mode 100644 index 00000000..f02aa934 --- /dev/null +++ b/GreedyAlgorithms/Knapsack.cpp @@ -0,0 +1,92 @@ +#include <iostream> +using namespace std; + +struct Item +{ + int weight; + int profit; +}; + +float profitPerUnit(Item x) +{ + return (float)x.profit / (float)x.weight; +} + +int partition(Item arr[], int low, int high) +{ + Item pivot = arr[high]; // pivot + int i = (low - 1); // Index of smaller element + + for (int j = low; j < high; j++) + { + // If current element is smaller than or + // equal to pivot + if (profitPerUnit(arr[j]) <= profitPerUnit(pivot)) + { + i++; // increment index of smaller element + Item temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + } + Item temp = arr[i + 1]; + arr[i + 1] = arr[high]; + arr[high] = temp; + return (i + 1); +} + +void quickSort(Item arr[], int low, int high) +{ + if (low < high) + { + + int p = partition(arr, low, high); + + quickSort(arr, low, p - 1); + quickSort(arr, p + 1, high); + } +} + +int main() +{ + cout << "\nEnter the capacity of the knapsack : "; + float capacity; + cin >> capacity; + cout << "\n Enter the number of Items : "; + int n; + cin >> n; + Item itemArray[n]; + for (int i = 0; i < n; i++) + { + cout << "\nEnter the weight and profit of item " << i + 1 << " : "; + cin >> itemArray[i].weight; + cin >> itemArray[i].profit; + } + + quickSort(itemArray, 0, n - 1); + + // show(itemArray, n); + + float maxProfit = 0; + int i = n; + while (capacity > 0 && --i >= 0) + { + if (capacity >= itemArray[i].weight) + { + maxProfit += itemArray[i].profit; + capacity -= itemArray[i].weight; + cout << "\n\t" << itemArray[i].weight << "\t" << itemArray[i].profit; + } + else + { + maxProfit += profitPerUnit(itemArray[i]) * capacity; + cout << "\n\t" << capacity << "\t" << profitPerUnit(itemArray[i]) * capacity; + capacity = 0; + break; + } + } + + cout << "\nMax Profit : " << maxProfit; + + return 0; +} \ No newline at end of file