蓝桥杯-质数拆分(python)

题目:将 2019拆分为若干个两两不同的质数之和,一共有多少种不同的方法?
注意交换顺序视为同一种方法,例如 2+2017=20192+2017=2019 与 2017+2=20192017+2=2019 视为同一种方法。

可以解释下下面代码中dp[0][0]为什么等于1,且dp数组如何初始化吗?

##质数拆分 本质是0-1背包
#第一步,首先求出2019以内的所有质数
flag = [True]*2020
n = 2019
for i in range(2,int(n**0.5)+1):
    if flag[i]:
        for j in range(i**2,n+1,i):
            flag[j]=False
prime = [x for x in range(2,n) if flag[x]]
lengthPrime = len(prime)
#第二步 进行0-1背包,2019就是容量,每个数我们可以放一次
dp = [[0]*(n+1) for _ in range(lengthPrime+1)]
dp[0][0]=1
#这里的dp[i][j]的含义是i质数能表示成质数之和的方法有j种
for i in range(1,lengthPrime+1):
    for j in range(n+1):
        dp[i][j]=dp[i-1][j]
        if j>=prime[i-1]:
            dp[i][j]+=dp[i-1][j-prime[i-1]]
print(dp[-1][-1])