Bookmarks    
nPr and nCr    
Random Number    
SD Calculator    
Sample Size    
Percent Error    
Density    
Molarity    
Molar Mass    
Ohm's Law    
Watts to Amps    
Voltage Drop    
Long Division    
Mixed Numbers    
Rounding    
Nth Root    
Exponents    
Half-Life    
Polar Form    
De Moivre    
3D Distance    
Point to Line    
Cross Product    
Determinant    
Sin Cos Tan    
Triangle Area    
Scale Factor    
Sector Area    
Ellipse Area    
Cube Volume    
Box Volume    
Sphere Volume    
Cone Volume    
Pipe Volume    
Time Duration    
Time Card    
Present Value    
Future Value    
Churn Rate    
A/B Test Calc    
SEO Traffic    
Ideal Weight    
Fat Intake    
Child Height    
Golf Handicap    
Heat Index    
Wind Chill    
Dew Point    
Download Time    
kWh to Cost    
AC Size (BTU)    
Heating Costs    
LED Savings    
Trip Gas Cost    
Tire Size    
Solar Output    
Solar Payback    
Battery Size    
Wall Area    
Gravel Needed    
Mortar Mix    
Slope Grade    
Curtain Size    
Soil Needed    
Sod Needed    
Ramp Length    
Blind Size    
Drain Slope    
Board Feet    
Heat Loss    
Furniture Fit    
Moving Boxes    
Plywood Cuts    
Shelf Sag    
   Add
Probability and random number calculators
Independent Events
Independent Events
Two Events Solver
Two Events Solver
Repeated Trials
Repeated Trials
Bayes' Theorem
Bayes' Theorem
Expected Value
Expected Value
Binomial Distribution
Binomial Distribution
nPr and nCr
nPr and nCr
Circular Permutation
Circular Permutation
With Repetition
With Repetition
Random Number
Random Number
Averages and statistics calculators
Average Calculator
Average Calculator
Mean Median Mode
Mean Median Mode
SD Calculator
SD Calculator
Quartiles & IQR
Quartiles & IQR
Frequency Table
Frequency Table
Correlation (r)
Correlation (r)
Normal Probability
Normal Probability
Z-Score Calculator
Z-Score Calculator
Confidence Interval
Confidence Interval
Sample Size
Sample Size
Mark & Recapture
Mark & Recapture
P-Value Calculator
P-Value Calculator
Percentage and ratio calculators
Percentage Calc
Percentage Calc
Percent Change
Percent Change
Percent Difference
Percent Difference
Percent Error
Percent Error
Ratio Calculator
Ratio Calculator
Discount Calculator
Discount Calculator
Sales Tax Calculator
Sales Tax Calculator
Margin Calculator
Margin Calculator
Speed calculators
Speed Calculator
Speed Calculator
Density and concentration calculators
Density
Density
Molarity
Molarity
Molar Mass
Molar Mass
Physics and electricity calculators
Ohm's Law
Ohm's Law
Watts to Amps
Watts to Amps
Resistor Colors
Resistor Colors
Voltage Drop
Voltage Drop
Unit conversion calculators
Weight Converter
Weight Converter
Shoe Size Converter
Shoe Size Converter
Integer and signed number calculators
Long Division
Long Division
LCM Calculator
LCM Calculator
GCF Calculator
GCF Calculator
Integer Calculator
Integer Calculator
Prime Factorization
Prime Factorization
Diophantine Solver
Diophantine Solver
Modulo Calculator
Modulo Calculator
Factor Calculator
Factor Calculator
Roman Numerals
Roman Numerals
Fraction, decimal and rounding calculators
Fraction Calculator
Fraction Calculator
Mixed Numbers
Mixed Numbers
Simplify Fractions
Simplify Fractions
Fraction to Decimal
Fraction to Decimal
Decimal to Fraction
Decimal to Fraction
Rounding
Rounding
Equation and inequality calculators
Linear Equation
Linear Equation
Linear Systems
Linear Systems
Quadratic Formula
Quadratic Formula
Absolute Value
Absolute Value
Quadratic Inequality
Quadratic Inequality
Polynomial calculators
Binomial Theorem
Binomial Theorem
Square root and nth root calculators
Simplify Radicals
Simplify Radicals
Nth Root
Nth Root
Exponent and logarithm calculators
Exponents
Exponents
Log Calculator
Log Calculator
Number of Digits
Number of Digits
Scientific Notation
Scientific Notation
Sci. Notation Math
Sci. Notation Math
Half-Life
Half-Life
Complex number calculators
Complex Numbers
Complex Numbers
Polar Form
Polar Form
De Moivre
De Moivre
Function and graph calculators
Slope Calculator
Slope Calculator
Linear Function
Linear Function
Direct & Inverse Variation
Direct & Inverse Variation
y = ax² Calculator
y = ax² Calculator
Distance Formula
Distance Formula
3D Distance
3D Distance
Section Formula
Section Formula
Point to Line
Point to Line
Lat/Long Distance
Lat/Long Distance
Complete the Square
Complete the Square
Circle Equation
Circle Equation
Conic Sections
Conic Sections
Polar Coordinates
Polar Coordinates
Sequence calculators
Arithmetic Sequence
Arithmetic Sequence
Geometric Sequence
Geometric Sequence
Fibonacci Sequence
Fibonacci Sequence
Recurrence Relation
Recurrence Relation
Vector calculators
Vector Calculator
Vector Calculator
Cross Product
Cross Product
Matrix calculators
Matrix Calculator
Matrix Calculator
Determinant
Determinant
Inverse Matrix
Inverse Matrix
Plane geometry calculators
Sin Cos Tan
Sin Cos Tan
Degrees ⇔ Radians
Degrees ⇔ Radians
a sin θ + b cos θ
a sin θ + b cos θ
Triangle Solver
Triangle Solver
Triangle Area
Triangle Area
Right Triangle
Right Triangle
Pythagorean Theorem
Pythagorean Theorem
Polygon Angles
Polygon Angles
Scale Factor
Scale Factor
Parallel Lines
Parallel Lines
Rectangle Area
Rectangle Area
Parallelogram Area
Parallelogram Area
Trapezoid Area
Trapezoid Area
Circle Calculator
Circle Calculator
Sector Area
Sector Area
Inscribed Angle
Inscribed Angle
Ellipse Area
Ellipse Area
Solid geometry calculators
Cube Volume
Cube Volume
Cube Surface Area
Cube Surface Area
Box Volume
Box Volume
Box Surface Area
Box Surface Area
Cylinder Volume
Cylinder Volume
Cylinder Surface
Cylinder Surface
Sphere Volume
Sphere Volume
Sphere Surface
Sphere Surface
Spherical Cap Volume
Spherical Cap Volume
Cap Surface Area
Cap Surface Area
Ellipsoid Volume
Ellipsoid Volume
Ellipsoid Surface
Ellipsoid Surface
Pyramid Volume
Pyramid Volume
Pyramid Surface
Pyramid Surface
Cone Volume
Cone Volume
Cone Surface Area
Cone Surface Area
Frustum Volume
Frustum Volume
Frustum Surface Area
Frustum Surface Area
Pipe Volume
Pipe Volume
Capsule Volume
Capsule Volume
Capsule Surface Area
Capsule Surface Area
Date and time calculators
Age Calculator
Age Calculator
Days Between Dates
Days Between Dates
Date Calculator
Date Calculator
Hours From Now
Hours From Now
Day of the Week
Day of the Week
Time Calculator
Time Calculator
Time Zone Converter
Time Zone Converter
Hours Calculator
Hours Calculator
Time Duration
Time Duration
Time Card
Time Card
Finance and economics calculators
Compound Interest
Compound Interest
Simple Interest
Simple Interest
Interest Calculator
Interest Calculator
TVM Calculator
TVM Calculator
Present Value
Present Value
Future Value
Future Value
ROI Calculator
ROI Calculator
IRR Calculator
IRR Calculator
Payback Period
Payback Period
Average Return
Average Return
GDP Calculator
GDP Calculator
Web marketing and ad metric calculators
CTR Calculator
CTR Calculator
Conversion Rate
Conversion Rate
CPC, CPM & CPA
CPC, CPM & CPA
ROAS Calculator
ROAS Calculator
Break-Even CPA
Break-Even CPA
LTV Calculator
LTV Calculator
CAC Calculator
CAC Calculator
Churn Rate
Churn Rate
A/B Test Calc
A/B Test Calc
A/B Sample Size
A/B Sample Size
SEO Traffic
SEO Traffic
Break-Even Point
Break-Even Point
Markup vs. Margin
Markup vs. Margin
CAGR Calculator
CAGR Calculator
Health and fitness calculators
BMI Calculator
BMI Calculator
Sleep Calculator
Sleep Calculator
Calorie Calculator
Calorie Calculator
BMR Calculator
BMR Calculator
TDEE Calculator
TDEE Calculator
Ideal Weight
Ideal Weight
Body Fat Calculator
Body Fat Calculator
Lean Body Mass
Lean Body Mass
Calories Burned
Calories Burned
Protein Intake
Protein Intake
Macro Calculator
Macro Calculator
Carb Calculator
Carb Calculator
Fat Intake
Fat Intake
Child Height
Child Height
Sports calculators
Golf Handicap
Golf Handicap
Pace Calculator
Pace Calculator
1RM Calculator
1RM Calculator
Target Heart Rate
Target Heart Rate
Weather calculators
Heat Index
Heat Index
Wind Chill
Wind Chill
Dew Point
Dew Point
Computer calculators
Base Converter
Base Converter
Subnet Calculator
Subnet Calculator
Download Time
Download Time
Household energy and budget calculators
Electricity Cost
Electricity Cost
kWh to Cost
kWh to Cost
Yearly kWh to Cost
Yearly kWh to Cost
AC Size (BTU)
AC Size (BTU)
AC Running Cost
AC Running Cost
Heating Costs
Heating Costs
Gas vs Electric
Gas vs Electric
LED Savings
LED Savings
Salary Calculator
Salary Calculator
Budget Calculator
Budget Calculator
Car calculators
Trip Gas Cost
Trip Gas Cost
EV Charging Cost
EV Charging Cost
EV vs Gas Cost
EV vs Gas Cost
MPG Calculator
MPG Calculator
Tire Size
Tire Size
Solar power and battery calculators
Solar Output
Solar Output
Solar Panel Count
Solar Panel Count
Solar Payback
Solar Payback
Battery Size
Battery Size
Home and DIY calculators
Tile Calculator
Tile Calculator
Stair Calculator
Stair Calculator
Concrete Volume
Concrete Volume
Wall Area
Wall Area
Wallpaper Rolls
Wallpaper Rolls
Paint Calculator
Paint Calculator
Flooring Needed
Flooring Needed
Exterior Walls
Exterior Walls
Gravel Needed
Gravel Needed
Mortar Mix
Mortar Mix
Slope Grade
Slope Grade
Lumber Cut List
Lumber Cut List
Lot Coverage/FAR
Lot Coverage/FAR
Sheet Vinyl Roll
Sheet Vinyl Roll
Insulation Needed
Insulation Needed
Curtain Size
Curtain Size
TV Size & Distance
TV Size & Distance
Soil Needed
Soil Needed
Sod Needed
Sod Needed
Block Calculator
Block Calculator
Brick Calculator
Brick Calculator
Deck Materials
Deck Materials
Ramp Length
Ramp Length
Pilot Hole Size
Pilot Hole Size
Room Ventilation
Room Ventilation
Paint Thinning
Paint Thinning
Baseboard & Trim
Baseboard & Trim
Blind Size
Blind Size
Picture Hanging
Picture Hanging
Drain Slope
Drain Slope
Screw Calculator
Screw Calculator
Board Feet
Board Feet
Fence Calculator
Fence Calculator
Wood Shrinkage
Wood Shrinkage
Caulk Calculator
Caulk Calculator
Heat Loss
Heat Loss
Furniture Fit
Furniture Fit
Moving Boxes
Moving Boxes
Storage Capacity
Storage Capacity
Plywood Cuts
Plywood Cuts
Shelf Sag
Shelf Sag

Plywood Cut Calculator (How Many Pieces from a Sheet, 2D Cutting Layout)

Enter the sheet size, kerf, grain direction and the width, height and quantity of the parts you need (up to 8 kinds of parts; rows with both width and height blank are skipped). The thickness and price per sheet may be left blank.

× mm
Row Name (optional) Width (mm) Height (mm) Qty
A
B
C
D
E
F
G
H
Enter all lengths in millimeters (mm). A blank kerf uses 3 mm and a blank quantity uses 1. Unnamed parts are shown as "Part A" to "Part H".
Result and figure
Enter the size of the stock sheet and the width, height and quantity of the parts you need on the left and press "Calculate". The result and a figure of the cutting layout appear here.

What you can do on this page

  • Enter the size of the stock sheet (pick 4 × 8 ft, 4 × 10 ft, 4 × 12 ft and more from the list, or type it in) and the width, height and quantity of the parts you need (up to 8 kinds), and see right away how many sheets to buy
  • It allows for the kerf (the thickness of the saw blade, 1/8 in by default) and the grain direction (whether parts may be turned 90°). For a single kind of part it counts a grid of "across × down" (also comparing the turned orientation and turned parts in the leftover strip); for several kinds of parts it combines them with shelf packing, filling rows from the tallest part down
  • You get a color-coded cutting layout for each sheet, showing what goes where, and a layout table such as "Sheet 1: Top×2+Side×2, offcut 5.83 ft²". It also shows how many sheets combined cutting saves compared with cutting each part from its own sheets
  • It shows the offcut area, the yield (total area of the parts ÷ total area of the sheets) and the theoretical minimum number of sheets from area (the lower bound), and whether the layout matches that bound. Enter the price per sheet (optional) to get the estimated cost
  • A plain-language explanation of the formulas and copy-and-paste formulas for Excel, Google Sheets and Python are all on this page
The layout comes from fixed-step heuristics ("line up a single part across and down" and "sort the parts by height and pack them in rows", called shelf packing), so it does not always give the fewest sheets (the best answer is not guaranteed). Every cut is assumed to run straight from one edge of the sheet to the other (a guillotine cut), which matches what a home center's panel saw cutting service can do (straight cuts only; some stores limit the number of cuts per sheet). Professional cutting software searches more complex combinations, but this is accurate enough for buying and cutting in DIY projects. For one-dimensional cutting by length only, such as 2×4s, boards and pipes, use the "Lumber Cut List Calculator".

What is this calculation used for?

Buying plywood for a DIY bookcase, storage box or desk

Say you are building a project from 4 × 8 ft plywood (96 × 48 in) with 2 tops of 47 × 24 in, 4 sides of 36 × 21 in and 3 shelves of 30 × 18 in. Buying separately for each part takes 3 sheets, but combined cutting with rows by height needs only 2 (sheet 1: 2 tops + 2 sides; sheet 2: 2 sides + 3 shelves).
Plywood is bulky, hard to fit in a car and a nuisance to store if you buy too much, so deciding the number of sheets and the layout before you shop avoids waste. Use "Keep aligned" for decorative plywood whose grain should line up, and "Doesn't matter" for sheathing or boards you will paint, to save sheets.

Giving instructions to a home center cutting service

A home center's panel saw can only cut straight from one edge of the sheet to the other. Some stores make a few cuts for free and charge per cut after that, and some limit the number of cuts per sheet. The layout figure on this page follows that kind of cut (guillotine cuts), so you can give clear instructions following the figure, such as "first rip the sheet at 24 in from the top edge, then cut the upper strip at 47 in from the left" (the kerf is what the blade removes, so the cut positions are the part sizes themselves).
Counting the cuts beforehand gives you an idea of the fee and tells you whether you are within any limit. Set the kerf to match the store's panel saw blade (1/8 in is common, but you can ask). Some stores will not cut very narrow strips (a couple of inches or less), angles or cuts that stop partway, so if you need many thin parts, check first.

Fitting the design to sizes that cut well

24 × 24 in parts look like they should give 8 from a 4 × 8 sheet with no kerf, but with a 1/8 in kerf you get only \(\lfloor 96.125 \div 24.125 \rfloor = 3\) across and \(\lfloor 48.125 \div 24.125 \rfloor = 1\) down, so 3 pieces. Just changing them to 23 7/8 × 23 7/8 in gives 4 across × 2 down = 8.
Changing a part size slightly at the design stage can make a big difference in the number of sheets. Before you shop, try adjustments such as making the shelves 1/8 in shallower or splitting a top into two pieces with this calculator to save on materials.

Material planning in cabinet shops and sign shops (nesting)

In cabinet and furniture shops, millwork shops, sign shops (aluminum composite and acrylic panels) and sheet metal shops, material is a large share of the cost, so how parts are cut from sheets (nesting) and the yield are managed every day. The "yield" on this page, the total area of the parts divided by the total area of the sheets, has the same definition used in industry.
Real shops lay out hundreds of kinds of parts, so they use dedicated nesting software. Shelf packing is a textbook heuristic for 2D rectangle packing and one of the ideas behind such software.

Acrylic, glass, drywall, decorative panels and other sheet goods

Anything where you cut rectangles from standard-size sheets can be calculated with the same formulas as plywood: acrylic and PVC sheets, drywall (4 × 8, 4 × 10 and 4 × 12 ft), decorative panels, OSB and so on. For materials that you score and snap, such as glass or drywall, set the kerf to 0 (tile too, if you use a manual cutter; if you use a wet saw, enter the blade width), and choose "Doesn't matter" for materials with no grain to reduce the count.
Glass and thin acrylic crack easily, and patterned panels have limits on direction, so adjust the kerf and rotation settings to suit the material.

Formulas and figures

Pieces per sheet when cutting a single part
Figure
Standard notation (the usual math form)
\(c\) \(=\) \(\lfloor\) \((\) \(W\) \(+\) \(k\) \()\) \(\div\) \((\) \(w\) \(+\) \(k\) \()\) \(\rfloor\)
\(r\) \(=\) \(\lfloor\) \((\) \(H\) \(+\) \(k\) \()\) \(\div\) \((\) \(h\) \(+\) \(k\) \()\) \(\rfloor\)
\(m\) \(=\) \(c\) \(\times\) \(r\)
In words (symbols replaced with words)
④ \(c\): number across \(=\) \(\lfloor\) \((\) ① \(W\): sheet width \(+\) ② \(k\): kerf \()\) \(\div\) \((\) ③ \(w\): part width \(+\) \(k\): kerf \()\) \(\rfloor\)
⑦ \(r\): number down \(=\) \(\lfloor\) \((\) ⑤ \(H\): sheet height \(+\) \(k\): kerf \()\) \(\div\) \((\) ⑥ \(h\): part height \(+\) \(k\): kerf \()\) \(\rfloor\)
⑧ \(m\): pieces per sheet \(=\) \(c\): number across \(\times\) \(r\): number down
The formula in words
① Add one \(W\): sheet width and
② \(k\): kerf , then divide by the
③ \(w\): part width plus the kerf \(k\), and round down to a whole number (the sign \(\lfloor\ \rfloor\) stands for rounding down) to get the
④ \(c\): number across . In the same way, divide the
⑤ \(H\): sheet height plus the kerf by the
⑥ \(h\): part height plus the kerf and round down to get the
⑦ \(r\): number down . Multiplying the two gives the
⑧ \(m\): pieces per sheet
Quick example
When cutting 30 × 20 in shelves from a 4 × 8 ft sheet of plywood (96 × 48 in) with a 1/8 in (0.125 in) kerf, the pieces per sheet are
\(c\): number across \(=\) \(\lfloor\) \((\) sheet width (96 in) \(+\) kerf (0.125 in) \()\) \(\div\) \((\) part width (30 in) \(+\) kerf (0.125 in) \()\) \(\rfloor\)
\(r\): number down \(=\) \(\lfloor\) \((\) sheet height (48 in) \(+\) kerf (0.125 in) \()\) \(\div\) \((\) part height (20 in) \(+\) kerf (0.125 in) \()\) \(\rfloor\)
\(m\): pieces per sheet \(=\) \(c\): number across \(\times\) \(r\): number down
\(c = \lfloor 96.125 \div 30.125 \rfloor = \lfloor 3.19 \cdots \rfloor = 3\)
\(r = \lfloor 48.125 \div 20.125 \rfloor = \lfloor 2.39 \cdots \rfloor = 2\)
\(m = 3 \times 2 = 6\)
Key idea
To fit \(n\) pieces across, the widths of \(n\) pieces plus \(n - 1\) kerfs between them must fit in the sheet width (the last piece can run to the edge of the sheet, so no cut is needed there). That is \(n \times w + (n - 1) \times k \le W\), and adding \(k\) to both sides gives \(n \times (w + k) \le W + k\). So "sheet width + kerf" divided by "part width + kerf", rounded down, is the number across. The height works the same way, so 2D cutting is a multiplication: "number across × number down". This formula uses the factory edge of the sheet as the edge of the parts. If the edges are chipped or not square and you trim them, enter the sheet size minus the trim. Ignoring the kerf can give the wrong count. For example, 24 × 24 in pieces look like they should give 4 across × 2 down = 8 from a 4 × 8 sheet with no kerf, but with a 1/8 in kerf you get only \(\lfloor 96.125 \div 24.125 \rfloor = 3\) across and \(\lfloor 48.125 \div 24.125 \rfloor = 1\) down, so 3 pieces (the fourth piece across is 3/8 in short, and the second row 1/8 in short). If the grain direction doesn't matter, this calculator also does the same count with the part turned 90° (width and height swapped) and uses the larger count. It also tries placing turned parts in the strip left on the right or at the bottom of the grid (for example, 3 across × 3 down = 9, plus 1 turned part in the leftover width on the right, for 10). This simple count is for a single kind of part; several kinds of parts are combined with the shelf packing below.
Sheets if each part is bought separately
Standard notation (the usual math form)
\(B_i\) \(=\) \(\lceil\) \(q_i\) \(\div\) \(m_i\) \(\rceil\)
\(B_{\text{sep}}\) \(=\) \(B_1 + B_2 + \cdots\)
In words (symbols replaced with words)
③ \(B_i\): sheets needed for part \(i\) alone \(=\) \(\lceil\) ① \(q_i\): quantity of part \(i\) \(\div\) ② \(m_i\): pieces per sheet \(\rceil\)
⑤ \(B_{\text{sep}}\): total sheets if bought separately \(=\) ④ sum of the sheets for each part \(B_1,\ B_2,\ \ldots\)
The formula in words
① Divide the \(q_i\): quantity of part \(i\) by the
② \(m_i\): pieces per sheet and round up to a whole number (the sign \(\lceil\ \rceil\) stands for rounding up) to get the
③ \(B_i\): sheets needed for part \(i\) alone . The
④ sum of the sheets for each part \(B_1,\ B_2,\ \ldots\) is the
⑤ \(B_{\text{sep}}\): total sheets if bought separately
Quick example
From 4 × 8 ft sheets (1/8 in kerf, parts may be turned), cutting 2 tops of 47 × 24 in, 4 sides of 36 × 21 in and 3 shelves of 30 × 18 in, each kind of part from its own sheets, takes
\(\text{Top}: \lceil 2 \div 3 \rceil = 1,\quad \text{Side}: \lceil 4 \div 5 \rceil = 1,\quad \text{Shelf}: \lceil 3 \div 6 \rceil = 1\)
\(B_{\text{sep}} = 1 + 1 + 1 = 3\)
Key idea
This simple count buys a separate set of sheets for each kind of part: "sheets for the tops", "sheets for the sides" and so on. One sheet gives 3 tops (turned, 3 across × 1 down), so 2 tops need 1 sheet (with 1 top's worth left over). One sheet gives 5 sides (2 across × 2 down, plus 1 turned in the 23.75 in strip left on the right), so 4 sides need 1 sheet. One sheet gives 6 shelves (3 across × 2 down), so 3 shelves need 1 sheet (with 3 shelves' worth left over). That is 3 sheets in total. This way is easy to think about and to cut, but the sheets for the tops and the shelves have large leftovers. The shelf packing below fills those leftovers with other parts to use fewer sheets.
Shelf packing (when parts fit in a row, and when rows fit on a sheet)
Figure
Standard notation (the usual math form)
\(w_1 + w_2 + \cdots + w_n\) \(+\) \((n - 1)\) \(\times\) \(k\) \(\leq\) \(W\)
\(h_1 + h_2 + \cdots + h_s\) \(+\) \((s - 1)\) \(\times\) \(k\) \(\leq\) \(H\)
In words (symbols replaced with words)
① sum of the widths of the parts in one row \(w_1,\ w_2,\ \ldots,\ w_n\) \(+\) ② number of parts in the row \(n\), minus 1 \(\times\) ③ \(k\): kerf \(\leq\) ④ \(W\): sheet width
⑤ sum of the row heights (each the height of the tallest part in that row) \(h_1,\ h_2,\ \ldots,\ h_s\) \(+\) ⑥ number of rows \(s\), minus 1 \(\times\) \(k\): kerf \(\leq\) ⑦ \(H\): sheet height
The formula in words
① If the sum of the widths of the parts in one row \(w_1,\ w_2,\ \ldots,\ w_n\) plus the
② number of parts in the row \(n\), minus 1 times the
③ \(k\): kerf (the total kerf between the parts) is at most the
④ \(W\): sheet width , the parts fit in that row. In the same way, if the
⑤ sum of the row heights \(h_1,\ h_2,\ \ldots,\ h_s\) plus the
⑥ number of rows \(s\), minus 1 times the kerf \(k\) is at most the
⑦ \(H\): sheet height , the rows fit on that sheet
Quick example
Packing the example above (2 tops of 47 × 24 in, 4 sides of 36 × 21 in and 3 shelves of 30 × 18 in, 1/8 in kerf) on 4 × 8 ft sheets with shelf packing, sheet 1 gets two rows: "2 tops" and "2 sides"
\(\text{Row 1 (height 24)}: 47 + 47 + 1 \times 0.125 = 94.125 \leq 96\)
\(\text{Row 2 (height 21)}: 36 + 36 + 1 \times 0.125 = 72.125 \leq 96\)
\(\text{Total row height}: 24 + 21 + 1 \times 0.125 = 45.125 \leq 48\)
Key idea
Shelf packing (FFDH, First Fit Decreasing Height) decides the layout in these steps. (1) Sort all parts from tallest to shortest (parts of the same height from widest to narrowest, and then in the order of the input rows). (2) Starting from the first part, put each one in the first existing row where it fits in the remaining width and is no taller than the row. If the grain direction doesn't matter, a row where the part fits when turned also counts. (3) If no row has room, start a new row on the first sheet that has enough height left for the part. If there is none, add a new sheet. The height of a row is the height of the first part placed in it (the tallest part in that row). Within a row, each part moves right by "width + kerf", and each row moves down by "height + kerf", which gives the two inequalities above. Dividing the sheet into rows lets every cut run straight from one edge of the sheet to the other (a guillotine cut), the same cuts a home center's panel saw cutting service can make. This calculator tries every combination of part orientation (if the grain direction doesn't matter: long side across, long side down, or as entered) and row direction (rows across or strips down) and uses the one with the fewest sheets. It also compares this with "fill sheets with a single part first and shelf-pack the rest" and with "cut each part from its own sheets", and shows the smallest. Even so, 2D cutting has a huge number of combinations, and there is no guarantee that this is the fewest possible sheets. Professional nesting software searches more complex combinations, including cuts that do not run edge to edge, but for home DIY it is practical to use this result as a guide and turn the offcuts into small projects.
Offcut area and yield
Standard notation (the usual math form)
\(A_{\text{off}}\) \(=\) \(B\) \(\times\) \(W\) \(\times\) \(H\) \(-\) \(\sum_i q_i\,w_i\,h_i\)
\(Y\) \(=\) \(\sum_i q_i\,w_i\,h_i\) \(\div\) \((\) \(B\) \(\times\) \(W\) \(\times\) \(H\) \()\) \(\times\) \(100\)
In words (symbols replaced with words)
⑤ \(A_{\text{off}}\): offcut area \(=\) ① \(B\): number of sheets \(\times\) ② \(W\): sheet width \(\times\) ③ \(H\): sheet height \(-\) ④ \(\sum_i q_i\,w_i\,h_i\): total area of all parts
⑥ \(Y\): yield (%) \(=\) \(\sum_i q_i\,w_i\,h_i\): total area of all parts \(\div\) \((\) \(B\): number of sheets \(\times\) \(W\): sheet width \(\times\) \(H\): sheet height \()\) \(\times\) \(100\)
The formula in words
① Multiply the \(B\): number of sheets by the
② \(W\): sheet width and the
③ \(H\): sheet height (the total area of the sheets you buy), and subtract the
④ \(\sum_i q_i\,w_i\,h_i\): total area of all parts to get the
⑤ \(A_{\text{off}}\): offcut area . Dividing the total area of the parts by the total area of the sheets and multiplying by 100 gives the
⑥ \(Y\): yield (%)
Quick example
For the example above (2 tops, 4 sides and 3 shelves packed onto two 4 × 8 ft sheets), the offcut area and yield are
\(\sum q\,w\,h = 2 \times 47 \times 24 + 4 \times 36 \times 21 + 3 \times 30 \times 18\)
\(= 2{,}256 + 3{,}024 + 1{,}620 = 6{,}900\ \text{in}^2\)
\(A_{\text{off}} = 2 \times 96 \times 48 - 6{,}900 = 2{,}316\ \text{in}^2 \approx 16.08\ \text{ft}^2\)
\(Y = 6{,}900 \div 9{,}216 \times 100 \approx 74.9\ \%\)
Key idea
The offcut area is the difference between the area of the sheets you bought and the area used for parts, so it also includes what turns into sawdust at the kerf (a 1/8 in kerf along an 8 ft cut loses 96 × 0.125 = 12 in², and this adds up with more parts). 1 ft² = 12 × 12 = 144 in², so divide a value in in² by 144 to get ft². The yield is the share of the material that ends up as parts. The closer to 100%, the less waste. It depends a lot on how well the part sizes match the sheet size (sizes that divide the sheet evenly give a high yield; odd sizes or many kinds of parts give a lower one), and some offcut is normal in home DIY. Offcuts can become small shelves or cleats, so the yield alone does not decide whether a layout is good.
Theoretical minimum sheets from area (lower bound)
Standard notation (the usual math form)
\(B_{\min}\) \(=\) \(\lceil\) \(\sum_i q_i\,(w_i + k)(h_i + k)\) \(\div\) \((W + k)(H + k)\) \(\rceil\)
In words (symbols replaced with words)
③ \(B_{\min}\): theoretical minimum sheets \(=\) \(\lceil\) ① \(\sum_i q_i\,(w_i + k)(h_i + k)\): sum of (width + kerf) × (height + kerf) for all parts \(\div\) ② \((W + k)(H + k)\): (sheet width + kerf) × (sheet height + kerf) \(\rceil\)
The formula in words
① Divide the \(\sum_i q_i\,(w_i + k)(h_i + k)\): sum of (width + kerf) × (height + kerf) for all parts by
② \((W + k)(H + k)\): (sheet width + kerf) × (sheet height + kerf) and round up to get the
③ \(B_{\min}\): theoretical minimum sheets
Quick example
For the example above (2 tops of 47 × 24 in, 4 sides of 36 × 21 in and 3 shelves of 30 × 18 in, 4 × 8 ft sheets, 1/8 in kerf), the theoretical minimum is
\(2 \times 47.125 \times 24.125 + 4 \times 36.125 \times 21.125 + 3 \times 30.125 \times 18.125\)
\(\approx 2{,}273.78 + 3{,}052.56 + 1{,}638.05 = 6{,}964.39\)
\((96 + 0.125) \times (48 + 0.125) = 96.125 \times 48.125 \approx 4{,}626.02\)
\(6{,}964.39 \div 4{,}626.02 \approx 1.51,\quad \lceil 1.51 \rceil = 2\)
Key idea
However well you arrange the parts, they cannot fit on sheets with less area than the parts. Counting the kerf too, treat each part as taking up \((w + k) \times (h + k)\) and each sheet as offering \((W + k) \times (H + k)\); the quotient rounded up is the lower bound set by area alone (you can never use fewer sheets than this). In the example, the 2 sheets from shelf packing match the lower bound of 2, so 2 is confirmed as the optimal number. In 2D cutting, though, parts often do not fit even when there is enough area, because the shapes do not match. For example, cutting one 90 × 24 in desktop and two 25 × 25 in box sides from a 4 × 8 sheet has an area lower bound of 1 sheet. But the height left below the desktop is \(48 - 24 - 0.125 = 23.875\) in, so the 25 in sides do not fit, and 2 sheets are needed. The gap between the lower bound and the real count is larger than in one-dimensional lumber cutting, so even when the result says "Approximate", a different combination may not use fewer sheets.
Sheets saved and estimated cost
Standard notation (the usual math form)
\(\Delta\) \(=\) \(B_{\text{sep}}\) \(-\) \(B\)
\(T\) \(=\) \(u\) \(\times\) \(B\)
In words (symbols replaced with words)
③ \(\Delta\): sheets saved \(=\) ① \(B_{\text{sep}}\): sheets if bought separately \(-\) ② \(B\): sheets with combined cutting
⑤ \(T\): estimated cost \(=\) ④ \(u\): price per sheet \(\times\) \(B\): sheets with combined cutting
The formula in words
① From the \(B_{\text{sep}}\): sheets if bought separately subtract the
② \(B\): sheets with combined cutting to get the
③ \(\Delta\): sheets saved . Multiplying the
④ \(u\): price per sheet by the sheets with combined cutting \(B\) gives the
⑤ \(T\): estimated cost
Quick example
In the example above, with one sheet at $45, the sheets saved and the cost are
\(\Delta = 3 - 2 = 1\)
\(T = 45 \times 2 = 90\)
\(45 \times 3 - 90 = 45\)
Key idea
Buying separately costs \(u \times B_{\text{sep}}\) and combined cutting costs \(u \times B\), so the difference is \(u \times \Delta\). Enter the price of one sheet as the unit price. The cost covers only the sheets; it does not include fees for cutting (often charged per cut beyond a few free cuts), delivery, finish and so on. To estimate cutting fees, count the cut lines in the layout figure.
For a single kind of part, "(sheet width + kerf) ÷ (part width + kerf), rounded down" times "the same for the height" gives the pieces per sheet. Several kinds of parts are combined with shelf packing, filling rows from the tallest part down (every cut runs edge to edge, a guillotine cut); if the result matches the lower bound from area, no fewer sheets are possible. Even if it does not match, the shapes of the parts often keep 2D cutting from reaching the lower bound, and the layout from this calculator is a guide that does not guarantee the best answer.

Symbols and terms

Symbols

\(W\) W The width of the stock sheet (in), the side-to-side length of one sheet you buy. It is the first letter of "width", in capitals to tell it apart from the part width \(w\).
\(H\) H The height of the stock sheet (in), the top-to-bottom length of one sheet. It is the first letter of "height", in capitals to tell it apart from the part height \(h\). If the grain direction doesn't matter, swapping width and height does not change the count (with "Keep aligned", it must match the direction of the parts).
\(w\), \(w_i\) w, w sub i The width of a part (a piece you want to cut, in). The \(i\) in \(w_i\) numbers the kind of part ("the \(i\)th kind"), since there are several kinds such as tops, sides and shelves.
\(h\), \(h_i\) h, h sub i The height of a part (in). In the shelf-packing formula, \(h_1,\ h_2,\ \ldots\) also stand for the height of each row (the height of the tallest part in that row).
\(k\) k The kerf (the thickness of the saw blade, in). Every cut removes this much of the board. It is the first letter of "kerf".
\(c\) c The number of pieces across the width of the sheet when cutting a single part, found with \(\lfloor (W + k) \div (w + k) \rfloor\). It is the first letter of "column".
\(r\) r The number of pieces down the height of the sheet when cutting a single part, found with \(\lfloor (H + k) \div (h + k) \rfloor\). It is the first letter of "row".
\(m\), \(m_i\) m, m sub i The pieces per sheet when cutting a single part: the number across \(c\) times the number down \(r\), \(m = c \times r\).
\(q_i\) q sub i The quantity of part \(i\) you need, from the first letter of "quantity".
\(B_i\) B sub i The number of sheets needed for part \(i\) alone, found with \(\lceil q_i \div m_i \rceil\).
\(B_{\text{sep}}\) B sep The total number of sheets when each part is cut from its own sheets (bought separately): all the \(B_i\) added up. "sep" stands for "separately".
\(B\) B The number of sheets needed with combined cutting (shelf packing and the like). It is the main answer on this page.
\(n\) n The number of parts side by side in one row. There are \(n - 1\) kerfs between them, so it appears in the condition for fitting in a row. It is the first letter of "number".
\(s\) s The number of rows on one sheet. There are \(s - 1\) kerfs between the rows, so it appears in the condition for the rows to fit. It is the first letter of "shelf", since the rows are called shelves in shelf packing.
\(A_{\text{off}}\) A off The offcut area (in², ft²). It is the total area of the sheets bought minus the total area of the parts, and it includes what turns into sawdust at the kerf. \(A\) is the first letter of "area", and "off" stands for "offcut".
\(Y\) Y The yield (%), the total area of the parts divided by the total area of the sheets, times 100. It is the first letter of "yield".
\(B_{\min}\) B min The theoretical minimum number of sheets from area (the lower bound), found with \(\lceil \sum_i q_i (w_i + k)(h_i + k) \div ((W + k)(H + k)) \rceil\). If the sheets with combined cutting \(B\) match it, the layout is optimal. "min" is short for minimum.
\(\Delta\) delta The number of sheets saved, \(B_{\text{sep}} - B\). The Greek letter delta is often used for a difference (it matches the d of "difference").
\(u\) u The price of one stock sheet ($), from "unit price".
\(T\) T The estimated cost ($), from the first letter of "total". It covers only the sheets, not cutting fees or delivery.
\(\lfloor x \rfloor\) floor of x The sign for rounding down to a whole number, called the floor function. (Example - \(\lfloor 3.19 \rfloor = 3\), \(\lfloor 2 \rfloor = 2\)) The pieces you can cut drop the part that does not fit, so this sign is used.
\(\lceil x \rceil\) ceiling of x The sign for rounding up to a whole number, called the ceiling function. (Example - \(\lceil 1.51 \rceil = 2\), \(\lceil 2 \rceil = 2\)) The sheets you buy add one more sheet for any shortfall, so this sign is used.
\(\sum\) sigma The sign for "add them all up". \(\sum_i q_i w_i h_i\) says: for each kind of part \(i\), work out \(q_i w_i h_i\) (quantity × width × height) and add them all. It is the Greek letter sigma, which matches the S of "sum".

Terms

stock sheet The large board the parts are cut from. It can be any sheet material sold in standard sizes, such as plywood, MDF, decorative panels, acrylic or sheet metal. This page treats it as a rectangle of width \(W\) × height \(H\).
cutting layout Deciding how to cut the parts you need from the stock sheets (also called a cut list or cutting diagram). This page handles 2D cutting, which considers both width and height; 1D cutting by length only, such as boards and pipes, is handled by the "Lumber Cut List Calculator".
kerf The width of material lost at each saw cut, equal to the thickness of the blade. A full-kerf circular saw or table saw blade is typically 1/8 in, and a thin-kerf blade about 3/32 in. If you know your blade's kerf (it is often printed on the blade), enter that. It adds up with every cut, so it matters most when you cut many small parts.
grain direction The direction of the wood fibers, which shows as the pattern on the surface of a board. With decorative plywood or solid wood, parts look odd unless the grain all runs the same way, so the parts sometimes cannot be turned 90°. On this page, choose whether parts may turn with "Grain direction". For sheathing plywood or boards you will paint, "Doesn't matter" is fine.
guillotine cut A cut that runs straight from one edge of the sheet to the other. The pieces are then cut edge to edge again, and so on, until the parts are free. The panel saws used for cutting services at home centers can only make this kind of cut, so this calculator limits its layouts to shapes that can be cut this way (shelf packing). Allowing cuts that stop partway (L-shaped notches) can sometimes pack more tightly, but they are also hard to make with a home circular saw, so they are not used.
shelf packing (FFDH) A layout procedure that sorts the parts from tallest to shortest and fills rows (called shelves) across the sheet from the top down. FFDH stands for First Fit Decreasing Height (tallest first, into the first row that fits), a classic heuristic for 2D rectangle packing. Every cut runs edge to edge, so the layout can go straight to a cutting service. It gives good results for such a simple procedure, but not always the fewest sheets.
offcut Material left over after the parts are cut, such as long thin strips at the edge of the sheet or scraps at the end of a row. The fewer offcuts, the less material is wasted and the higher the yield. Large offcuts can become small shelves or cleats.
yield The share of the material that ends up as products (parts). On this page it is "total area of the parts ÷ total area of the sheets bought", and it gets closer to 100% with fewer offcuts and less kerf.
lower bound A value that can never be beaten, however clever you are. The theoretical minimum number of sheets on this page is a lower bound from area; if the layout uses that many sheets, it is optimal. Even when it does not, the shapes of the parts often keep 2D cutting from reaching the lower bound.
optimal solution The best answer among all possible ways. Here, it is the layout that uses the fewest sheets. If the sheets with combined cutting match the lower bound, it is an optimal solution; if not, this calculator does not search every combination, so it cannot confirm whether the layout is optimal.
heuristic A method that quickly finds a good answer with fixed steps, but with no guarantee of the best answer. In combination problems such as cutting layouts, the number of possible arrangements explodes as parts are added, so not all of them can be tried, and heuristics are widely used in practice. The shelf packing and grid counts on this page are heuristics too.
plywood A board made by gluing thin sheets of wood (veneers) together with the grain of each layer at right angles to the next. It resists warping and can be made in large sheets, so it is widely used for shelves, boxes and subfloors. Types include sheathing plywood, sanded plywood (such as birch or pine) and decorative plywood. Common thicknesses are 1/4, 1/2 and 3/4 in (nominal; the actual thickness is often a little less, such as 23/32 in for 3/4 in).
OSB Oriented strand board, made of wood strands pressed and glued together. It is a common, low-cost sheathing panel for walls, roofs and subfloors, sold in 4 × 8 ft sheets like plywood (longer sheets also exist for walls). Its surface is rough, so it is mostly used where it will be covered.
4×8 sheet The standard sheet size in the US, 4 ft × 8 ft (48 × 96 in), used for plywood, OSB, MDF, drywall and many other panels. It is the default on this page. MDF is often sold slightly larger, at 49 × 97 in.
4×10 Longer sheets of 4 × 10 ft (48 × 120 in) and 4 × 12 ft (48 × 144 in). They are used for tall walls and long parts without seams; drywall often comes in these lengths. Check the exact size of the product you buy and enter it.
project panel A smaller precut panel sold at home centers, such as 2 × 4 ft, 4 × 4 ft or 2 × 2 ft. It is easier to carry, but it usually costs more per square foot than a full 4 × 8 sheet.

Good to know before you start

Here is what helps you use the calculation on this page with real understanding, not just by pressing the button.

Division with remainders (Grades 3–4)
  • Seeing that in "96 ÷ 30 = 3 R 6", the quotient is how many pieces fit and the remainder is how much is left over
Rounding (Grade 4)
  • Knowing the difference between rounding down, rounding up and rounding to the nearest whole number
  • Being able to explain in your own words why the pieces you can cut are rounded down and the sheets you buy are rounded up
Area of a rectangle (Grades 3–4)
  • Knowing that the area of a rectangle is width × height, and converting between in² and ft² (\(1\,\text{ft}^2 = 144\,\text{in}^2\))
Ratios and percents (Grade 6)
  • Being able to write a ratio as a percent, as in the yield "total area of the parts ÷ total area of the sheets × 100"
Expressions and inequalities with variables (Grades 6–7)
  • Being able to write a condition with variables, such as "\(n\) pieces fit when \(n \times w + (n-1) \times k \le W\)"
  • Knowing that adding the same number to both sides of an inequality keeps it true (the step to \(n(w + k) \le W + k\))

How to calculate it in Excel

Copy the whole table below and paste it into cell A1 in Excel. It works as is.
Table for the pieces per sheet when cutting a single part
Sheet width (in) 96
Sheet height (in) 48
Part width (in) 30
Part height (in) 20
Kerf (in) 0.125
Number across =INT((B1+B5)/(B3+B5))
Number down =INT((B2+B5)/(B4+B5))
Pieces per sheet =B6*B7
Table for the sheets if each part is bought separately
Quantity of the part 8
Pieces per sheet 6
Sheets needed =ROUNDUP(B1/B2,0)
Table for the offcut area and yield
Number of sheets 2
Sheet width (in) 96
Sheet height (in) 48
Total area of all parts (in²) 4800
Offcut area (in²) =B1*B2*B3-B4
Offcut area (ft²) =B5/144
Yield (%) =B4/(B1*B2*B3)*100
Table for the theoretical minimum sheets from area
Sum of (width + kerf) × (height + kerf) for all parts (in²) 6964.390625
(Sheet width + kerf) × (sheet height + kerf) (in²) 4626.015625
Theoretical minimum sheets =ROUNDUP(B1/B2,0)
Table for the sheets saved and the estimated cost
Sheets if bought separately 3
Sheets with combined cutting 2
Price per sheet ($) 45
Sheets saved =B1-B2
Estimated cost ($) =B3*B2
After pasting, the upper rows of column B are your inputs and the lower rows are calculated automatically.
"INT(value)" rounds down to a whole number (the ⌊ ⌋ in the formulas), and "ROUNDUP(value, 0)" rounds up (the ⌈ ⌉).
B8 in the first table is 6 pieces (3 across × 2 down). B3 in the second table is 2 sheets. In the third table (eight 30 × 20 in parts on two sheets), B6 is about 30.67 ft² and B7 about 52.08%. B3 in the fourth table is 2 sheets, and the fifth table gives 1 sheet saved and a cost of $90.
Shelf packing itself is sorting the parts by height and fitting them into rows from the top, which is manual work. Use the spreadsheet to check the pieces per sheet, the offcut and the lower bound, and make the layout on this page or with the Python code below.

How to calculate it in Google Sheets

Copy the whole table below and paste it into cell A1 in Google Sheets. It works as is.
Table for the pieces per sheet when cutting a single part
Sheet width (in) 96
Sheet height (in) 48
Part width (in) 30
Part height (in) 20
Kerf (in) 0.125
Number across =INT((B1+B5)/(B3+B5))
Number down =INT((B2+B5)/(B4+B5))
Pieces per sheet =B6*B7
Table for the sheets if each part is bought separately
Quantity of the part 8
Pieces per sheet 6
Sheets needed =ROUNDUP(B1/B2,0)
Table for the offcut area and yield
Number of sheets 2
Sheet width (in) 96
Sheet height (in) 48
Total area of all parts (in²) 4800
Offcut area (in²) =B1*B2*B3-B4
Offcut area (ft²) =B5/144
Yield (%) =B4/(B1*B2*B3)*100
Table for the theoretical minimum sheets from area
Sum of (width + kerf) × (height + kerf) for all parts (in²) 6964.390625
(Sheet width + kerf) × (sheet height + kerf) (in²) 4626.015625
Theoretical minimum sheets =ROUNDUP(B1/B2,0)
Table for the sheets saved and the estimated cost
Sheets if bought separately 3
Sheets with combined cutting 2
Price per sheet ($) 45
Sheets saved =B1-B2
Estimated cost ($) =B3*B2
The same formulas as in Excel work as is (INT and ROUNDUP have the same names). Copy the whole table, paste it into cell A1, and replace the numbers in column B with your own.

How to calculate it in Python

import math

sheet_w, sheet_h = 96, 48      # stock sheet width and height (in), a 4 x 8 ft sheet
kerf = 0.125                   # kerf (saw blade thickness, in) = 1/8 in
rotate = True                  # True if grain direction does not matter (parts may be turned 90 degrees)
unit_price = 45.00             # price of one stock sheet ($)
# Parts to cut: (name, width in, height in, quantity)
parts = [("Top", 47, 24, 2), ("Side", 36, 21, 4), ("Shelf", 30, 18, 3)]

# Sheets if each part is bought separately (grid across x down; if rotation is allowed, also try the part turned)
def per_sheet(w, h):
    return int((sheet_w + kerf) // (w + kerf)) * int((sheet_h + kerf) // (h + kerf))   # round down (the ⌊ ⌋ in the formulas)
sheets_separate = 0
for name, w, h, qty in parts:
    m = max(per_sheet(w, h), per_sheet(h, w) if rotate else 0)
    sheets_separate += math.ceil(qty / m)   # round up (the ⌈ ⌉ in the formulas)

# Combined cutting: shelf packing (tallest first, into the first row that fits; if rotation is allowed, long side across)
pieces = []
for name, w, h, qty in parts:
    pw, ph = (max(w, h), min(w, h)) if rotate else (w, h)
    pieces += [(name, pw, ph)] * qty
pieces.sort(key=lambda p: (-p[2], -p[1]))
sheets = []   # for each sheet {"y": where the next row starts, "shelves": [{"y", "h", "x", "parts"}]}
for name, pw, ph in pieces:
    for sheet in sheets:
        shelf = next((s for s in sheet["shelves"] if ph <= s["h"] and pw <= sheet_w - s["x"]), None)
        if shelf is None and ph <= sheet_h - sheet["y"]:
            shelf = {"y": sheet["y"], "h": ph, "x": 0, "parts": []}
            sheet["shelves"].append(shelf)
            sheet["y"] += ph + kerf
        if shelf is not None:
            shelf["parts"].append((name, shelf["x"], shelf["y"], pw, ph))
            shelf["x"] += pw + kerf
            break
    else:
        sheets.append({"y": ph + kerf, "shelves": [{"y": 0, "h": ph, "x": pw + kerf, "parts": [(name, 0, 0, pw, ph)]}]})

# Offcut, yield and the lower bound from area
parts_area = sum(qty * w * h for name, w, h, qty in parts)
total_area = len(sheets) * sheet_w * sheet_h
lower_bound = math.ceil(sum(qty * (w + kerf) * (h + kerf) for name, w, h, qty in parts) / ((sheet_w + kerf) * (sheet_h + kerf)))

print(f"Sheets if each part is bought separately: {sheets_separate}")
print(f"Combined cutting (shelf packing): {len(sheets)} sheets (lower bound from area: {lower_bound})")
for i, sheet in enumerate(sheets, 1):
    for shelf in sheet["shelves"]:
        print(f"  Sheet {i} row (y={shelf['y']}): " + ", ".join(f"{n}@x={x} {pw}x{ph}" for n, x, y, pw, ph in shelf["parts"]))
print(f"Offcut area: {(total_area - parts_area) / 144:.2f} ft²  Yield: {parts_area / total_area * 100:.1f} %")
print(f"Estimated cost: ${unit_price * len(sheets):.2f}")
Runs with the standard library only. "//" is division rounded down (the ⌊ ⌋ in the formulas) and math.ceil() rounds up (the ⌈ ⌉). This code is the basic form of shelf packing (long side across, rows across only), so if the calculator on this page finds fewer sheets with other combinations of part and row orientation or by placing turned parts in leftover strips, the counts may differ (they match when the result equals the lower bound). The else of the for loop runs when the loop ends without break (when the part fits on no existing sheet) and adds a new sheet. Replace the sheet size, kerf and list of parts at the top with your own and run it.

How to write it in LaTeX and other math languages (copy and paste)

Pieces per sheet when cutting a single part
c = ⌊(W + k) ÷ (w + k)⌋,  r = ⌊(H + k) ÷ (h + k)⌋,  m = c × r
c = \left\lfloor \frac{W + k}{w + k} \right\rfloor,\quad r = \left\lfloor \frac{H + k}{h + k} \right\rfloor,\quad m = c \times r
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <mi>c</mi>
    <mo>=</mo>
    <mo>&#x230A;</mo>
    <mfrac>
      <mrow><mi>W</mi><mo>+</mo><mi>k</mi></mrow>
      <mrow><mi>w</mi><mo>+</mo><mi>k</mi></mrow>
    </mfrac>
    <mo>&#x230B;</mo>
    <mo>,</mo>
    <mi>r</mi>
    <mo>=</mo>
    <mo>&#x230A;</mo>
    <mfrac>
      <mrow><mi>H</mi><mo>+</mo><mi>k</mi></mrow>
      <mrow><mi>h</mi><mo>+</mo><mi>k</mi></mrow>
    </mfrac>
    <mo>&#x230B;</mo>
    <mo>,</mo>
    <mi>m</mi>
    <mo>=</mo>
    <mi>c</mi>
    <mo>&#xD7;</mo>
    <mi>r</mi>
  </mrow>
</math>
c = |__ (W + k) / (w + k) __|,  r = |__ (H + k) / (h + k) __|,  m = c * r
c = Floor[(W + k)/(w + k)]; r = Floor[(H + k)/(h + k)]; m = c*r
c := floor((W + k)/(w + k));  r := floor((H + k)/(h + k));  m := c*r;
c = floor((W + k)/(w + k)); r = floor((H + k)/(h + k)); m = c*r;
c = ⌊(W + k)/(w + k)⌋, r = ⌊(H + k)/(h + k)⌋, m = c × r
Sheets if each part is bought separately
Bᵢ = ⌈qᵢ ÷ mᵢ⌉,  Bsep = B₁ + B₂ + …
B_i = \left\lceil \frac{q_i}{m_i} \right\rceil,\quad B_{\text{sep}} = \sum_i B_i
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <msub><mi>B</mi><mi>i</mi></msub>
    <mo>=</mo>
    <mo>&#x2308;</mo>
    <mfrac><msub><mi>q</mi><mi>i</mi></msub><msub><mi>m</mi><mi>i</mi></msub></mfrac>
    <mo>&#x2309;</mo>
    <mo>,</mo>
    <msub><mi>B</mi><mtext>sep</mtext></msub>
    <mo>=</mo>
    <munder><mo>&#x2211;</mo><mi>i</mi></munder>
    <msub><mi>B</mi><mi>i</mi></msub>
  </mrow>
</math>
B_i = |~ q_i / m_i ~|,  B_"sep" = sum_i B_i
Total[Ceiling[q/m]]
B := add(ceil(q[i]/m[i]), i = 1 .. n);
B = sum(ceil(q ./ m));
B_i = ⌈q_i/m_i⌉, B_sep = ∑_i B_i
Shelf packing (when parts fit in a row, and when rows fit on a sheet)
w₁ + w₂ + … + wₙ + (n − 1)k ≤ W,  h₁ + h₂ + … + hₛ + (s − 1)k ≤ H
\sum_{j=1}^{n} w_j + (n - 1)k \leq W,\quad \sum_{t=1}^{s} h_t + (s - 1)k \leq H
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <munderover><mo>&#x2211;</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover>
    <msub><mi>w</mi><mi>j</mi></msub>
    <mo>+</mo>
    <mo>(</mo><mi>n</mi><mo>&#x2212;</mo><mn>1</mn><mo>)</mo><mi>k</mi>
    <mo>&#x2264;</mo>
    <mi>W</mi>
    <mo>,</mo>
    <munderover><mo>&#x2211;</mo><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mi>s</mi></munderover>
    <msub><mi>h</mi><mi>t</mi></msub>
    <mo>+</mo>
    <mo>(</mo><mi>s</mi><mo>&#x2212;</mo><mn>1</mn><mo>)</mo><mi>k</mi>
    <mo>&#x2264;</mo>
    <mi>H</mi>
  </mrow>
</math>
sum_(j=1)^n w_j + (n - 1) k <= W,  sum_(t=1)^s h_t + (s - 1) k <= H
Total[w] + (Length[w] - 1)*k <= W && Total[h] + (Length[h] - 1)*k <= H
add(w[j], j = 1 .. n) + (n - 1)*k <= W;  add(h[t], t = 1 .. s) + (s - 1)*k <= H;
sum(w) + (numel(w) - 1)*k <= W && sum(h) + (numel(h) - 1)*k <= H
∑_(j=1)^n w_j + (n − 1)k ≤ W, ∑_(t=1)^s h_t + (s − 1)k ≤ H
Offcut area and yield
Aoff = B × W × H − Σ qᵢ wᵢ hᵢ,  Y = Σ qᵢ wᵢ hᵢ ÷ (B × W × H) × 100
A_{\text{off}} = B\,W\,H - \sum_i q_i w_i h_i,\quad Y = \frac{\sum_i q_i w_i h_i}{B\,W\,H} \times 100
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <msub><mi>A</mi><mtext>off</mtext></msub>
    <mo>=</mo>
    <mi>B</mi><mo>&#x2062;</mo><mi>W</mi><mo>&#x2062;</mo><mi>H</mi>
    <mo>&#x2212;</mo>
    <munder><mo>&#x2211;</mo><mi>i</mi></munder>
    <msub><mi>q</mi><mi>i</mi></msub><msub><mi>w</mi><mi>i</mi></msub><msub><mi>h</mi><mi>i</mi></msub>
    <mo>,</mo>
    <mi>Y</mi>
    <mo>=</mo>
    <mfrac>
      <mrow><munder><mo>&#x2211;</mo><mi>i</mi></munder><msub><mi>q</mi><mi>i</mi></msub><msub><mi>w</mi><mi>i</mi></msub><msub><mi>h</mi><mi>i</mi></msub></mrow>
      <mrow><mi>B</mi><mo>&#x2062;</mo><mi>W</mi><mo>&#x2062;</mo><mi>H</mi></mrow>
    </mfrac>
    <mo>&#xD7;</mo>
    <mn>100</mn>
  </mrow>
</math>
A_"off" = B W H - sum_i q_i w_i h_i,  Y = (sum_i q_i w_i h_i) / (B W H) * 100
{B*W*H - Total[q*w*h], Total[q*w*h]/(B*W*H)*100}
Awaste := B*W*H - add(q[i]*w[i]*h[i], i = 1 .. n);  Y := add(q[i]*w[i]*h[i], i = 1 .. n)/(B*W*H)*100;
Awaste = B*W*H - sum(q .* w .* h); Y = sum(q .* w .* h)/(B*W*H)*100;
A_off = BWH − ∑_i q_i w_i h_i, Y = (∑_i q_i w_i h_i)/(BWH) × 100
Theoretical minimum sheets from area (lower bound)
Bmin = ⌈Σ qᵢ (wᵢ + k)(hᵢ + k) ÷ ((W + k)(H + k))⌉
B_{\min} = \left\lceil \frac{\sum_i q_i (w_i + k)(h_i + k)}{(W + k)(H + k)} \right\rceil
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <msub><mi>B</mi><mi>min</mi></msub>
    <mo>=</mo>
    <mo>&#x2308;</mo>
    <mfrac>
      <mrow><munder><mo>&#x2211;</mo><mi>i</mi></munder><msub><mi>q</mi><mi>i</mi></msub><mo>(</mo><msub><mi>w</mi><mi>i</mi></msub><mo>+</mo><mi>k</mi><mo>)</mo><mo>(</mo><msub><mi>h</mi><mi>i</mi></msub><mo>+</mo><mi>k</mi><mo>)</mo></mrow>
      <mrow><mo>(</mo><mi>W</mi><mo>+</mo><mi>k</mi><mo>)</mo><mo>(</mo><mi>H</mi><mo>+</mo><mi>k</mi><mo>)</mo></mrow>
    </mfrac>
    <mo>&#x2309;</mo>
  </mrow>
</math>
B_min = |~ (sum_i q_i (w_i + k)(h_i + k)) / ((W + k)(H + k)) ~|
Ceiling[Total[q*(w + k)*(h + k)]/((W + k)*(H + k))]
Bmin := ceil(add(q[i]*(w[i] + k)*(h[i] + k), i = 1 .. n)/((W + k)*(H + k)));
Bmin = ceil(sum(q .* (w + k) .* (h + k))/((W + k)*(H + k)));
B_min = ⌈(∑_i q_i (w_i + k)(h_i + k))/((W + k)(H + k))⌉
Sheets saved and estimated cost
Δ = Bsep − B,  T = u × B
\Delta = B_{\text{sep}} - B,\quad T = u \times B
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <mi>&#x394;</mi>
    <mo>=</mo>
    <msub><mi>B</mi><mtext>sep</mtext></msub>
    <mo>&#x2212;</mo>
    <mi>B</mi>
    <mo>,</mo>
    <mi>T</mi>
    <mo>=</mo>
    <mi>u</mi>
    <mo>&#xD7;</mo>
    <mi>B</mi>
  </mrow>
</math>
Delta = B_"sep" - B,  T = u * B
{bSep - b, u*b}
Delta := Bsep - B;  T := u*B;
Delta = Bsep - B; T = u*B;
Δ = B_sep − B, T = u × B

How to have ChatGPT  do the calculation

You are a calculation assistant for plywood cutting layouts (cut lists). Do the following calculation by actually running Python code, and base your answer only on the numbers from the execution result (do not answer by mental math or guessing).

From 4 × 8 ft plywood sheets (96 × 48 in), with a 1/8 in (0.125 in) kerf and parts allowed to turn 90 degrees, cut 2 tops of 47 × 24 in, 4 sides of 36 × 21 in and 3 shelves of 30 × 18 in.
Find each of the following:
1. For each part, the pieces per sheet when cutting only that part (⌊(96 + 0.125) ÷ (width + 0.125)⌋ × ⌊(48 + 0.125) ÷ (height + 0.125)⌋; also calculate with width and height swapped and use the larger)
2. The total number of sheets if each part is cut from its own sheets (the sum of "quantity ÷ pieces per sheet, rounded up")
3. The number of sheets and the position of each part on each sheet with shelf packing: sort the parts from tallest to shortest and fill rows across the sheet from the top down (First Fit Decreasing Height; within a row each part moves right by width + kerf, and each row moves down by height + kerf)
4. The offcut area (total area of the sheets − total area of the parts, in ft²) and the yield (%)
5. The theoretical minimum number of sheets from area (the sum of (width + 0.125) × (height + 0.125) for all parts, divided by (96 + 0.125) × (48 + 0.125), rounded up)

Show the code you used and the numbers from the execution result.

How to Use
  1. 1
    Enter your numbers
    Type the numbers you want to calculate with into the input fields
  2. 2
    Calculate
    Press the "Calculate" button
  3. 3
    Check the result
    The result appears on the spot. The same page also explains the idea behind the calculation and the formula
  DataChef Features
Easy and Free
Unlimited conversions for free.
No technical knowledge required.
Intuitive and user-friendly operation.
No Registration Required
Available immediately after access.
Can be used without registering personal information.
Safe and Secure
Fully SSL encrypted communication.
Automatic file deletion by clicking "download".
Fast
High-speed site access
and rapid file conversion.
No Watermark
No watermark.
No attribution required.
Commercial Use Available
Free for commercial use.
No need to contact us for commercial use permission.