Python Program to find the number of operations to pack several metal bars in a container

Suppose we are given the task to transport several metal bars of different sizes. The transportation container has limited length and can only contain bars of length 1. We are provided n number of bars with their lengths given in a list. To fit all bars in the container, we must cut and divide them into unit sizes, then pack them (which costs one operation per bar).

The key insight is that cutting a bar optimally requires finding its prime factorization and cutting along those factors to minimize operations.

Problem Analysis

For input input_arr = [6, 3, 7], the output will be 22:

  • Bar of size 6: Cut into 2×3, then each into 1s = 6 + 6 + 4 = 16 operations

  • Bar of size 3: Cut into 3×1 = 3 + 3 = 6 operations

  • Bar of size 7: Cut into 7×1 = 7 + 7 = 14 operations

  • Total operations = 6 + 3 + 7 (initial bars) + cuts = 22

Algorithm Steps

We solve this by:

  1. Generate prime numbers using Sieve of Eratosthenes

  2. For each bar, find its prime factorization

  3. Calculate minimum operations using dynamic programming on prime factors

  4. Sum all operations including the initial bar count

Implementation

from math import floor, sqrt

def prime_find(input_num):
    prime_check = [True] * ((input_num - 1) // 2)
    for p_num in range(3, floor(sqrt(input_num)) + 1, 2):
        if prime_check[(p_num - 3) // 2]:
            prime_check[(p_num**2 - 3) // 2::p_num] = [False] * ((input_num - p_num**2) // (2 * p_num) + 1)
    return [2] + [2 * i + 3 for i in range((input_num - 1) // 2) if prime_check[i]]

def solve(input_arr):
    prime_nums = prime_find(10**6 + 100)
    result = 0
    
    for value in input_arr:
        result += value  # Add the original bar length
        f_list = []
        
        # Find prime factorization
        for p_num in prime_nums:
            while value % p_num == 0:
                f_list.append(p_num)
                value //= p_num
            if p_num**2 > value:
                if value > 1:
                    f_list.append(value)
                break
        
        # Calculate operations using reverse iteration
        temp = 1
        for p_num in f_list[::-1]:
            result += temp
            temp *= p_num
    
    return result

# Test the solution
input_arr = [6, 3, 7]
print(f"Input: {input_arr}")
print(f"Operations needed: {solve(input_arr)}")
Input: [6, 3, 7]
Operations needed: 22

How It Works

The algorithm works in two phases:

Phase 1 - Prime Generation: Uses Sieve of Eratosthenes to generate all primes up to 10^6, which helps in efficient factorization.

Phase 2 - Operation Calculation: For each bar, we find its prime factors and calculate the minimum cuts needed. The reverse iteration through prime factors ensures we count operations optimally.

Example Walkthrough

For bar length 6:

  • Prime factors: [2, 3]

  • Operations: 6 (original) + 1 (cut into 2×3) + 2 (cut each 3 into 1s) = 9

  • But the algorithm calculates this more systematically using the factorization tree

Conclusion

This problem combines prime factorization with dynamic programming to find the minimum operations needed to cut metal bars into unit lengths. The key insight is using prime factors to determine optimal cutting strategies.

Updated on: 2026-03-25T20:27:58+05:30

257 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements