To solve this linear programming optimization problem, we first need to define the decision variables, objective function, and constraints based on the given information.

- Decision Variables: Let \(S\) be the number of surfboards made and \(K\) be the number of skateboards made.
- Objective Function: The goal is to maximize profit. The profit per surfboard is $70, and the profit per skateboard is $45. Therefore, the objective function can be written as: Maximize \(70S + 45K\).
- Constraints:
  - Wood Constraint: Each surfboard requires 5 units of wood, and each skateboard requires 4 units of wood. There are 700 units of wood available. So, the constraint is \(5S + 4K \leq 700\).
  - Paint Constraint: Each surfboard requires 3 units of paint, and each skateboard requires 2 units of paint. There are 320 units of paint available. Thus, the constraint is \(3S + 2K \leq 320\).
  - Non-Negativity Constraints: Since the number of surfboards and skateboards cannot be negative, we have \(S \geq 0\) and \(K \geq 0\).

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the decision variables
S = m.addVar(vtype=GRB.CONTINUOUS, name="Surfboards", lb=0)
K = m.addVar(vtype=GRB.CONTINUOUS, name="Skateboards", lb=0)

# Set the objective function
m.setObjective(70*S + 45*K, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*S + 4*K <= 700, "Wood_Constraint")
m.addConstr(3*S + 2*K <= 320, "Paint_Constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Surfboards to make: {S.x}")
    print(f"Skateboards to make: {K.x}")
    print(f"Maximum profit: ${70*S.x + 45*K.x:.2f}")
else:
    print("No optimal solution found")
```