code: def bpp(s,B):
      
      n = len(s)
      U = len(FFD(s,B)) # upper bound of the number of bins
      model = Model("bpp")
      # setParam("MIPFocus",1)
      x,y = {},{}
      for i in range(n):
          for j in range(U):
              x[i,j] = model.addVar(vtype="B", name="x(%s,%s)"%(i,j))
      for j in range(U):
          y[j] = model.addVar(vtype="B", name="y(%s)"%j)
  
      # assignment constraints
      for i in range(n):
          model.addCons(quicksum(x[i,j] for j in range(U)) == 1, "Assign(%s)"%i)
  
      # bin capacity constraints
      for j in range(U):
          model.addCons(quicksum(s[i]*x[i,j] for i in range(n)) <= B*y[j], "Capac(%s)"%j)
  
      # tighten assignment constraints
      for j in range(U):
          for i in range(n):
              model.addCons(x[i,j] <= y[j], "Strong(%s,%s)"%(i,j))
  
      # tie breaking constraints
      for j in range(U-1):
          model.addCons(y[j] >= y[j+1],"TieBrk(%s)"%j)
  
      # SOS constraints
      for i in range(n):
          model.addConsSOS1([x[i,j] for j in range(U)])
  
      model.setObjective(quicksum(y[j] for j in range(U)), "minimize")
      model.data = x,y
  
      return model
docs: bpp: Martello and Toth's model to solve the bin packing problem.
      Parameters:
          - s: list with item widths
          - B: bin capacity
      Returns a model, ready to be solved.