TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
0_1_knapsack.cpp
Go to the documentation of this file.
1
24
25#include <array>
26#include <cassert>
27#include <iostream>
28#include <vector>
29
34namespace dynamic_programming {
39namespace knapsack {
50template <size_t n>
51int maxKnapsackValue(const int capacity, const std::array<int, n> &weight,
52 const std::array<int, n> &value) {
53 std::vector<std::vector<int> > maxValue(n + 1,
54 std::vector<int>(capacity + 1, 0));
55 // outer loop will select no of items allowed
56 // inner loop will select the capacity of the knapsack bag
57 int items = sizeof(weight) / sizeof(weight[0]);
58 for (size_t i = 0; i < items + 1; ++i) {
59 for (size_t j = 0; j < capacity + 1; ++j) {
60 if (i == 0 || j == 0) {
61 // if no of items is zero or capacity is zero, then maxValue
62 // will be zero
63 maxValue[i][j] = 0;
64 } else if (weight[i - 1] <= j) {
65 // if the ith item's weight(in the actual array it will be at i-1)
66 // is less than or equal to the allowed weight i.e. j then we
67 // can pick that item for our knapsack. maxValue will be the
68 // obtained either by picking the current item or by not picking
69 // current item
70
71 // picking the current item
72 int profit1 = value[i - 1] + maxValue[i - 1][j - weight[i - 1]];
73
74 // not picking the current item
75 int profit2 = maxValue[i - 1][j];
76
77 maxValue[i][j] = std::max(profit1, profit2);
78 } else {
79 // as the weight of the current item is greater than the allowed weight, so
80 // maxProfit will be profit obtained by excluding the current item.
81 maxValue[i][j] = maxValue[i - 1][j];
82 }
83 }
84 }
85
86 // returning maximum value
87 return maxValue[items][capacity];
88}
89} // namespace knapsack
90} // namespace dynamic_programming
91
96static void test() {
97 // Test 1
98 const int n1 = 3; // number of items
99 std::array<int, n1> weight1 = {10, 20, 30}; // weight of each item
100 std::array<int, n1> value1 = {60, 100, 120}; // value of each item
101 const int capacity1 = 50; // capacity of carrying bag
103 capacity1, weight1, value1);
104 const int expected_max_value1 = 220;
105 assert(max_value1 == expected_max_value1);
106 std::cout << "Maximum Knapsack value with " << n1 << " items is "
107 << max_value1 << std::endl;
108
109 // Test 2
110 const int n2 = 4; // number of items
111 std::array<int, n2> weight2 = {24, 10, 10, 7}; // weight of each item
112 std::array<int, n2> value2 = {24, 18, 18, 10}; // value of each item
113 const int capacity2 = 25; // capacity of carrying bag
115 capacity2, weight2, value2);
116 const int expected_max_value2 = 36;
117 assert(max_value2 == expected_max_value2);
118 std::cout << "Maximum Knapsack value with " << n2 << " items is "
119 << max_value2 << std::endl;
120}
121
126int main() {
127 // Testing
128 test();
129 return 0;
130}
int maxKnapsackValue(const int capacity, const std::array< int, n > &weight, const std::array< int, n > &value)
Picking up all those items whose combined weight is below the given capacity and calculating the valu...
void test()
int main()
Main function.
Dynamic Programming algorithms.