To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote:

- \(x_b\) as the number of bookcases,
- \(x_d\) as the number of dining tables.

The objective is to maximize profit. The profit per bookcase is $150, and the profit per dining table is $200. So, the objective function can be written as:

\[ \text{Maximize:} \quad 150x_b + 200x_d \]

Now, let's consider the constraints:

1. **Floor Space Constraint**: The total floor space available is 1200 sq ft. A bookcase requires 15 sq ft, and a dining table requires 8 sq ft. This gives us:

\[ 15x_b + 8x_d \leq 1200 \]

2. **Bookcase Percentage Constraint**: At least 20% of all items must be bookcases. If \(x_b + x_d\) represents the total number of items, then:

\[ x_b \geq 0.20(x_b + x_d) \]
\[ x_b \geq 0.20x_b + 0.20x_d \]
\[ 0.80x_b \geq 0.20x_d \]
\[ 4x_b \geq x_d \]

3. **Capital Constraint**: A bookcase ties up $1200 in capital, and a dining table ties up $1500. The maximum capital to be tied up is $50,000. So:

\[ 1200x_b + 1500x_d \leq 50000 \]

Now, let's implement this linear programming problem using Gurobi in Python:

```python
from gurobipy import *

# Create a model
m = Model("Furniture_Store")

# Define the decision variables
x_b = m.addVar(lb=0, vtype=GRB.INTEGER, name="bookcases")
x_d = m.addVar(lb=0, vtype=GRB.INTEGER, name="dining_tables")

# Set the objective function
m.setObjective(150*x_b + 200*x_d, GRB.MAXIMIZE)

# Add constraints
m.addConstr(15*x_b + 8*x_d <= 1200, "floor_space")
m.addConstr(x_b >= 0.20*(x_b + x_d), "bookcase_percentage")
m.addConstr(1200*x_b + 1500*x_d <= 50000, "capital")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print("Bookcases:", x_b.x)
    print("Dining Tables:", x_d.x)
    print("Maximum Profit:", m.objVal)
else:
    print("No optimal solution found.")
```