质数拆分
将2019拆分为若干个两两不同的质数之和,一共有多少种不同的方法?注意交换顺序视为同一种方法,例如2+2017 =2019 与2017+2=2019视为同一种方法。
方法一
思路:
和01背包的思路一样只不过是以种数了统计结果,i为2019到2的质数,j就是2019的可能性。f[0][0]=1 因为本身也是一种可能。f[i][j]=f[i-1][j]这个是把f[i-1][j]这层传递下来然后f[i][j]+=f[i-1][j-z1[i]]是把[j-z1[i]]+f[i][j]上层结果加这层质数的可能数累计。
程序:
def z(a):
if a==2 or a==3:
return 1
if a%2==0:
return 0
p=1
while p*p<=a:
p+=2
if a%p==0:
return 0
return 1
z1=[0]
for i in range(2,2020):
if z(i):
z1.append(i)
f=[[0 for i in range(2023)]for i in range(2023)]
f[0][0]=1
for i in range(1,len(z1)):
for j in range(0 ,2020):
f[i][j]=f[i-1][j]
if j>=z1[i]:
f[i][j]+=f[i-1][j-z1[i]]
print(f[len(z1)-1 ][2019])
优化空间后的方法:
思路:
我们可以用一维的思路来做这到题 。
def z(a):
if a==2 or a==3:
return 1
if a%2==0:
return 0
p=1
while p*p<=a:
p+=2
if a%p==0:
return 0
return 1
z1=[0]
for i in range(2,2020):
if z(i):
z1.append(i)
f=[0 for i in range(2023)]
f[0]=1
for i in range(1,len(z1)):
for j in range(2019,z1[i]-1,-1):
f[j]+=f[j-z1[i]]
print(f[2019])
禁止转载。仅用于自己学习。对程序错误不负责。