Rod Cutting Problem in C++
Last Updated :
23 Sep, 2024
The Rod Cutting Problem is a classic dynamic programming problem where a rod of length N and a list of prices for smaller pieces of rod is given, and the task is to determine the maximum value obtainable by cutting up the rod and selling the pieces. The length of the rod is taken as the size of the price array.
Example
Input: prices[] = {1, 5, 8, 9, 10, 17, 17, 20}
Output: 22
Explanation: By cutting the rod into two pieces of length 2 and 6, we get a maximum price of 5 + 17 = 22.
Input: prices[] = {2, 5, 7, 8, 10}
Output: Maximum obtainable price = 12
Explanation: By cutting the rod into two pieces of length 2 and 3, we get a maximum price of 5 + 7 = 12.
In C++, rod cutting problem can be solved using the following methods:
More methods to solve the rod cutting problem are given here - Rod Cutting
Using Recursion
In this approach, we recursively compute the maximum price by trying all possible cuts at each step.
- The basic idea is to cut into two pieces: one of length i and the other of length (n - i) where i is from 1 to n.
- Then compute the sum of the price of the piece of length i and the maximum price obtainable from the remaining rod (n - i).
- We repeat this for all lengths i and return the maximum value.
Code Implementation
C++
// C++ program to solve the Rod Cutting Problem using recursion
#include <bits/stdc++.h>
using namespace std;
int cutRod(vector<int>& prices, int n) {
// Base case: when rod length is 0, the price is 0
if (n == 0) return 0;
// Initialize maximum value
int res = 0;
// Try all possible cuts and recursively get the best price
for (int i = 1; i <= n; i++) {
// Recursively calculate the maximum obtainable price
res = max(res, prices[i - 1] + cutRod(prices, n - i));
}
return res;
}
int main() {
// Prices array
vector<int> prices = {1, 5, 8, 9, 10, 17, 17, 20};
int rodLength = prices.size();
// Calculate and print the maximum obtainable price
cout << cutRod(prices, rodLength) << endl;
return 0;
}
Time Complexity: Exponential
Space Complexity: O(n) where n is the length of the price array.
This method has exponential time complexity because it leads to many redundant calculations.
Using Dynamic Programming
The cutting rod problem is ideally solved using dynamic programming due to redundant calculation. We use a to store the maximum obtainable price for each length when calculated for the first time. After that, we refer to this table instead of calculating the price again.
Code Implementation
C++
// C++ program to solve the Rod Cutting Problem
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int cutRod(vector<int>& prices, int n) {
// dp[] will store the maximum price
// obtainable for each length
vector<int> dp(n + 1, 0);
// Build the dp array
for (int i = 1; i <= n; i++) {
int res = 0;
// Try all possible cuts
for (int j = 0; j < i; j++) {
res = max(res, prices[j]
+ dp[i - j - 1]);
}
dp[i] = res;
}
// Maximum price obtainable for rod length
// n will be at dp[n]
return dp[n];
}
int main() {
// Prices array
vector<int> prices = {1, 5, 8, 9, 10,
17, 17, 20};
int rodLength = prices.size();
// Calculate and print the maximum
// obtainable price
cout << cutRod(prices, rodLength) << endl;
return 0;
}
Time Complexity: O(n2), where n is the length of the price array.
Space Complexity: O(n)
Similar Reads
Rod Cutting Problem in C The Rod Cutting problem is a classic problem in dynamic programming. Given a rod of length n inches and an array of prices that contains prices of all pieces of size smaller than n, the task is to determine the maximum value obtainable by cutting up the rod and selling the pieces.In this article, we
8 min read
list resize() function in C++ STL The list::resize() is a built-in function in C++ STL which is used to resize a list container. It takes a number n as parameter and resizes the list container to contain exactly n elements. If the list already has more than n elements, then the function erases the elements from the list except the f
2 min read
find() in C++ STL C++ find() is a built-in function used to find the first occurrence of an element in the given range. It works with any container that supports iterators, such as arrays, vectors, lists, and more. In this article, we will learn about find() function in C++.C++#include <bits/stdc++.h> using nam
2 min read
Naming Convention in C++ Naming a file or a variable is the first and the very basic step that a programmer takes to write clean codes, where naming has to be appropriate so that for any other programmer it acts as an easy way to read the code. In C++, naming conventions are the set of rules for choosing the valid name for
6 min read
Output of C++ programs | Set 39 (Pointers) Prerequisite: Pointers in C/C++ QUE.1 What would be printed from the following C++ program? CPP #include <iostream> #include <stdlib.h> using namespace std; int main() { float x = 5.999; float* y, *z; y = &x; z = y; cout << x << ", " << *(&x) <<
4 min read