g | x | w | all
Bytes Lang Time Link
307Python 3.8 prerelease250806T114951Zceilingc
1091Python3220331T155600ZAjax1234

Python 3.8 (pre-release), 345 333 323 313 307 bytes

def f(a,b,c,d):
 k=A=0;W=[0]*len(b);Y=[0]*len(C:=[j for i,j in c for _ in range(i)]);S=[0]*len(d)
 while a>0:
  i=l=m=0;k+=1
  for g,h in d:S[i]=z=-~S[i]%h;a-=(z<1)*g;i+=1
  for j in C:
   if-~Y[l]==j:Y[l]=0;a-=1
   elif Y[l]+A:Y[l]+=1;A-=A>0
   l+=1
  for g,h in b:W[m]=z=-~W[m]%h;A+=(z<1)*g;m+=1
 return k

Try it online!

Less golfed version

L=len
R=range
Z=lambda x:[i[1]for i in x for j in R(i[0])]
def f(a,b,c,d):
 k=0                # current timestep
 A=0                # number of clothes ready to dry
 W=[0]*L(B:=Z(b))   # each machine has its own element in the array
 Y=[0]*L(C:=Z(c))
 S=[0]*L(D:=Z(d))
 while a>0:         # loop until all clothes washed
  #print([W,A,Y,S,a])
  for i in R(L(S)): # run dishwasher
   a-=-~S[i]//D[i]
   S[i]=-~S[i]%D[i]
  for i in R(L(Y)): # run dryer
   if-~Y[i]==C[i]:
    Y[i]=0
    a-=1
   elif Y[i]+A:
    Y[i]+=1
    A-=A>0
  for i in R(L(W)): # run washer
   A+=-~W[i]//B[i]
   W[i]=-~W[i]%B[i]
  k+=1
 return k

Python3, 1091 bytes:

import itertools as I
g=lambda x:[[a,[0,b]]for a,b in x]
E=enumerate
def p(m,o):
 k=0
 for i,a in E(m):
  if a[1][1]==1:k+=a[1][0];m[i][1][1]=o[i][1];m[i][1][0]=0
  elif a[1][0]:m[i][1][1]-=1
 return k
C=lambda x:eval(str(x))
def P(d):
 a,b=zip(*[(a[0],range(0,[0,a[0]][a[1][0]==0]+1))for i,a in E(d)])
 return[[a,i]for i in I.product(*b)]
def U(b,d):
 for x,y in P(d):
  if(s:=sum(y))<=b:
   D=C(d)
   for i,(j,k)in E(zip(x,y)):D[i][1][0]+=k
   yield b-s,D
def K(N,r,Q,s=[]):
 if[]==Q:yield(N,r,s);return
 if Q[0][1]:
  if Q[0][0]in[0,2]:
   for a,b in U([N,0,r][Q[0][0]],Q[0][1]):yield from K([a,0,N][Q[0][0]],[r,0,a][Q[0][0]],Q[1:],s+[b])
  else:
   for x in[{0:N,1:r},{1:r,0:N}]:
    b=Q[0][1]
    for i in[*x]:
     for a,b in U(x[i],b):x[i]=a;yield from K(x[0],x[1],Q[1:],s+[b])
 else:yield from K(N,r,Q[1:],s+[Q[0][1]])
def f(n,w,d,s):
 q=[(n,*map(g,[w,d,s]),0,0,0)];O=[]
 while q:
  N,*U,r,c,t=q.pop(0)
  W,D,S=map(C,U)
  if c==n:return t-1
  r+=p(W,w);c+=p(D,d)+p(S,s)
  for _n,_r,[_w,_s,_d]in K(N,r,[(0,W),(1,S),(2,D)]):
   if(M:=(_n,_w,_d,_s,_r,c,t+1)) not in O:
    q+=[M];O+=[M]

Try it online!

Very brute force solution and as such, it times out on the larger test cases. I will come back to those later.