Buggy python submission (verdict: Time Limit Exceeded):
import sys
readline = sys.stdin.readline

# dp[i][j][k] = 寿司が3つの皿がi個、2つの皿がj個、1つの皿がk個からの操作回数の期待値
# dp[0][0][0] = 0で正しいので、ここから順に埋めていけばよい。

N = int(readline())
A = list(map(int,readline().split()))

cnt = [0] * 4

for a in A:
  cnt[a] += 1

dp = [[[0 for k in range(N + 2)] for j in range(N + 2)] for i in range(N + 2)]

for i in range(N + 1):
  for j in range(N + 1):
    for k in range(N + 1):
      nonzero = i + j + k
      if nonzero == 0:
        continue
      dp[i][j][k] = N / nonzero
      if i - 1 >= 0:
        dp[i][j][k] += dp[i - 1][j + 1][k] * i / nonzero
      if j - 1 >= 0:
        dp[i][j][k] += dp[i][j - 1][k + 1] * j / nonzero
      if k - 1 >= 0:
        dp[i][j][k] += dp[i][j][k - 1] * k / nonzero

print(dp[cnt[3]][cnt[2]][cnt[1]])


Fixed submission:
import sys
readline = sys.stdin.readline

# dp[i][j][k] = 寿司が3つの皿がi個、2つの皿がj個、1つの皿がk個からの操作回数の期待値
# dp[0][0][0] = 0で正しいので、ここから順に埋めていけばよい。

N = int(readline())
A = list(map(int,readline().split()))

cnt = [0] * 4

for a in A:
  cnt[a] += 1

dp = [[[0 for k in range(N + 2)] for j in range(N + 2)] for i in range(N + 2)]

for i in range(N + 1):
  for j in range(N + 1):
    for k in range(N + 1):
      nonzero = i + j + k
      if nonzero == 0:
        continue
      dp[i][j][k] = N / nonzero
      if i - 1 >= 0:
        dp[i][j][k] += dp[i - 1][j + 1][k] * i / nonzero
      if j - 1 >= 0:
        dp[i][j][k] += dp[i][j - 1][k + 1] * j / nonzero
      if k - 1 >= 0:
        dp[i][j][k] += dp[i][j][k - 1] * k / nonzero

print(dp[cnt[3]][cnt[2]][cnt[1]])

Buggy python submission (verdict: Time Limit Exceeded):
import sys
readline = sys.stdin.readline

# サイコロで1が出るまでにサイコロを振る回数の期待値は、1が出る確率の逆数で1/(1/6) = 6
# 
# 皿に乗った寿司が1,0,0であるとき、寿司1が乗った皿を選ぶまでの試行回数の期待値は3
# [1,1,1]　に対して、最初に寿司が乗った皿を選ぶ試行回数の期待値は1/(3/3) = 1
# 残る状態は[0,1,1] (皿は区別しない)
# ここから寿司が乗った皿を選ぶ試行回数の期待値は1/(2/3) = 1.5
# 残る状態は[0,0,1]
# ここから寿司が乗った皿を選ぶ試行回数の期待値は1/(1/3) = 3
# すべて足し合わせると1 + 1.5 + 3 = 5.5

# 寿司が乗ってる皿の数が分かれば、次の状態に移行するときの期待値が分かるので足し上げていく
# dp[i][j][k] = 寿司が1個乗った皿がi個、寿司が2個乗った皿がj個、寿司が3個乗った皿がk個の
# 状態から最終状態までの期待値
# 寿司が1個乗った皿を選ぶとき
# dp[i][j][k] から dp[i - 1][j][k]に遷移
# N個からi個の皿を選ぶときの試行回数の期待値はN / i
# 寿司が2個乗った皿を選ぶとき (寿司が1個の皿が一つ増える)
# dp[i][j][k] から dp[i + 1][j - 1][k]に遷移
# N個からj個の皿を選ぶときの試行回数の期待値はN / j
# 寿司が3個乗った皿を選ぶとき (寿司が2個の皿が一つ増える)
# dp[i][j][k] から dp[i][j + 1][k - 1]に遷移
# dp[0][0][0] = 0 (寿司が乗った皿が残った状態は最終状態)

N = int(readline())
A = list(map(int,readline().split()))

# sushi[n] : 寿司がn個乗った皿の枚数
sushi = [0] * 4
for a in A:
  if a > 0:
    sushi[a] += 1
    
dp = [[[-1 for k in range(N + 1)] for j in range(N + 1)] for i in range(N + 1)]

def solve(i,j,k):
  if dp[i][j][k] != -1:
    return dp[i][j][k]
  if i == 0 and j == 0 and k == 0:
    return 0.0
  ret = 0.0
  if i > 0:
    ret += solve(i - 1,j,k) * i
  if j > 0:
    ret += solve(i + 1,j - 1,k) * j
  if k > 0:
    ret += solve(i,j + 1,k - 1) * k
  ret += N
  ret *= 1.0 / (i + j + k)
  dp[i][j][k] = ret
  return ret

print(solve(sushi[1],sushi[2],sushi[3]))

Fixed submission:
import sys
readline = sys.stdin.readline

# dp[i][j][k] = 寿司が3つの皿がi個、2つの皿がj個、1つの皿がk個からの操作回数の期待値
# dp[0][0][0] = 0で正しいので、ここから順に埋めていけばよい。

N = int(readline())
A = list(map(int,readline().split()))

cnt = [0] * 4

for a in A:
  cnt[a] += 1

dp = [[[0 for k in range(N + 2)] for j in range(N + 2)] for i in range(N + 2)]

for i in range(N + 1):
  for j in range(N + 1):
    for k in range(N + 1):
      nonzero = i + j + k
      if nonzero == 0:
        continue
      dp[i][j][k] = N / nonzero
      if i - 1 >= 0:
        dp[i][j][k] += dp[i - 1][j + 1][k] * i / nonzero
      if j - 1 >= 0:
        dp[i][j][k] += dp[i][j - 1][k + 1] * j / nonzero
      if k - 1 >= 0:
        dp[i][j][k] += dp[i][j][k - 1] * k / nonzero

print(dp[cnt[3]][cnt[2]][cnt[1]])

Buggy python submission (verdict: Time Limit Exceeded):
import sys
readline = sys.stdin.readline

# サイコロで1が出るまでにサイコロを振る回数の期待値は、1が出る確率の逆数で1/(1/6) = 6
# 
# 皿に乗った寿司が1,0,0であるとき、寿司1が乗った皿を選ぶまでの試行回数の期待値は3
# [1,1,1]　に対して、最初に寿司が乗った皿を選ぶ試行回数の期待値は1/(3/3) = 1
# 残る状態は[0,1,1] (皿は区別しない)
# ここから寿司が乗った皿を選ぶ試行回数の期待値は1/(2/3) = 1.5
# 残る状態は[0,0,1]
# ここから寿司が乗った皿を選ぶ試行回数の期待値は1/(1/3) = 3
# すべて足し合わせると1 + 1.5 + 3 = 5.5

# 寿司が乗ってる皿の数が分かれば、次の状態に移行するときの期待値が分かるので足し上げていく
# dp[i][j][k] = 寿司が1個乗った皿がi個、寿司が2個乗った皿がj個、寿司が3個乗った皿がk個の
# 状態から最終状態までの期待値
# 寿司が1個乗った皿を選ぶとき
# dp[i][j][k] から dp[i - 1][j][k]に遷移
# N個からi個の皿を選ぶときの試行回数の期待値はN / i
# 寿司が2個乗った皿を選ぶとき (寿司が1個の皿が一つ増える)
# dp[i][j][k] から dp[i + 1][j - 1][k]に遷移
# N個からj個の皿を選ぶときの試行回数の期待値はN / j
# 寿司が3個乗った皿を選ぶとき (寿司が2個の皿が一つ増える)
# dp[i][j][k] から dp[i][j + 1][k - 1]に遷移
# dp[0][0][0] = 0 (寿司が乗った皿が残った状態は最終状態)

N = int(readline())
A = list(map(int,readline().split()))

# sushi[n] : 寿司がn個乗った皿の枚数
sushi = [0] * 4
for a in A:
  if a > 0:
    sushi[a] += 1
    
dp = [[[-1 for k in range(N + 1)] for j in range(N + 1)] for i in range(N + 1)]

def solve(i,j,k):
  if dp[i][j][k] != -1:
    return dp[i][j][k]
  if i == 0 and j == 0 and k == 0:
    return 0.0
  ret = 0.0
  if i > 0:
    ret += solve(i - 1,j,k) * i
  if j > 0:
    ret += solve(i + 1,j - 1,k) * j
  if k > 0:
    ret += solve(i,j + 1,k - 1) * k
  ret += N
  ret *= 1.0 / (i + j + k)
  dp[i][j][k] = ret
  return ret

print(solve(sushi[1],sushi[2],sushi[3]))

Fixed submission:
import sys
readline = sys.stdin.readline

# dp[i][j][k] = 寿司が3つの皿がi個、2つの皿がj個、1つの皿がk個からの操作回数の期待値
# dp[0][0][0] = 0で正しいので、ここから順に埋めていけばよい。

N = int(readline())
A = list(map(int,readline().split()))

cnt = [0] * 4

for a in A:
  cnt[a] += 1

dp = [[[0 for k in range(N + 2)] for j in range(N + 2)] for i in range(N + 2)]

for i in range(N + 1):
  for j in range(N + 1):
    for k in range(N + 1):
      nonzero = i + j + k
      if nonzero == 0:
        continue
      dp[i][j][k] = N / nonzero
      if i - 1 >= 0:
        dp[i][j][k] += dp[i - 1][j + 1][k] * i / nonzero
      if j - 1 >= 0:
        dp[i][j][k] += dp[i][j - 1][k + 1] * j / nonzero
      if k - 1 >= 0:
        dp[i][j][k] += dp[i][j][k - 1] * k / nonzero

print(dp[cnt[3]][cnt[2]][cnt[1]])