Here's the formulation of the linear program and the Gurobi code to solve it:

**Decision Variables:**

* `x`: Number of bookcases
* `y`: Number of dining tables

**Objective Function:**

Maximize profit: `150x + 200y`

**Constraints:**

* **Floor space:** `15x + 8y <= 1200`
* **Minimum bookcases:** `x >= 0.2(x + y)`  (equivalent to `0.8x - 0.2y >= 0`)
* **Capital:** `1200x + 1500y <= 50000`
* **Non-negativity:** `x >= 0`, `y >= 0`


```python
import gurobipy as gp
from gurobipy import GRB

# Create a new model
m = gp.Model("furniture_store")

# Create variables
x = m.addVar(vtype=GRB.CONTINUOUS, name="bookcases") # Allowing fractional bookcases/tables for simplicity.  Could be changed to GRB.INTEGER
y = m.addVar(vtype=GRB.CONTINUOUS, name="tables")

# Set objective
m.setObjective(150*x + 200*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(15*x + 8*y <= 1200, "floor_space")
m.addConstr(0.8*x - 0.2*y >= 0, "min_bookcases")
m.addConstr(1200*x + 1500*y <= 50000, "capital")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal profit: ${m.objVal:.2f}")
    print(f"Number of bookcases: {x.x:.2f}")
    print(f"Number of tables: {y.x:.2f}")
elif m.status == GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {m.status}")

```
