To solve the optimization problem described, we first need to identify the decision variables, constraints, and the objective function.

1. **Decision Variables:**
   - Let \(C\) be the number of couches stocked.
   - Let \(B\) be the number of beds stocked.

2. **Constraints:**
   - Space constraint: Each couch takes 15 sq ft, and each bed takes 20 sq ft. The total space available is 300 sq ft. Thus, \(15C + 20B \leq 300\).
   - Minimum percentage of beds: At least 50% of the items in stock should be beds. This can be represented as \(B \geq 0.5(C + B)\) or simplified to \(B \geq C\).
   - Budget constraint: The store wants to spend at most $8000. Each couch costs $300, and each bed costs $600. Thus, \(300C + 600B \leq 8000\).

3. **Objective Function:**
   - The profit per couch sold is $200, and the profit per bed sold is $400. We want to maximize profit, so the objective function is to maximize \(200C + 400B\).

Given these elements, we can construct a linear programming model and solve it using Gurobi in Python.

```python
from gurobipy import *

# Create a new model
m = Model("Furniture_Stocking")

# Decision variables
couches = m.addVar(vtype=GRB.INTEGER, name="couches")
beds = m.addVar(vtype=GRB.INTEGER, name="beds")

# Objective function: Maximize profit
m.setObjective(200*couches + 400*beds, GRB.MAXIMIZE)

# Constraints
m.addConstr(15*couches + 20*beds <= 300, "space_constraint")
m.addConstr(beds >= couches, "minimum_beds_percentage")
m.addConstr(300*couches + 600*beds <= 8000, "budget_constraint")
m.addConstr(couches >= 0, "non_negative_couches")
m.addConstr(beds >= 0, "non_negative_beds")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Couches: {couches.x}")
    print(f"Beds: {beds.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```