题目描述
解题思路
看一共有多少个不同的方法,用动态规划背包问题。从最开始的质数算一共用多少种组成方法,然后一直迭代。
数组dp[i]含义在数字大小为i的条件下,能拆分为若干个两两不同的质数之和的方法数.(n>=2)
对于dp[j]而言可以看成是在数字总和是dp[j-i](其中i是素数)的条件下去装上一个素数i
无论装哪个素数其第一次装的方法数总是1
所以当j==i时赋值dp[i]=1
i从质数数组正向遍历,j从2-2019逆向遍历
代码
def sushu(i):
if i%2 == 0:
return i==2
if i%3 == 0:
return i==3
if i%5 == 0:
return i==5
if i%7 == 0:
return i==7
for j in range(11,int(math.sqrt(i)+1),2):
if i%j == 0:
return False
return True
nums = []
for i in range(2,2018):
if sushu(i):
nums.append(i)
target = 2019
dp = [0 for i in range(target + 1)]
for i in nums:
for j in range(target, i - 1, -1):
if j == i:
dp[j] += 1
if j - i >= 0:
dp[j] += dp[j - i] # 如果要求位置不同也算的话就要乘了
print(dp[-1])