10届国赛java试题 B: 质数拆分

质数拆分


将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])

禁止转载。仅用于自己学习。对程序错误不负责。

猜你喜欢

转载自blog.csdn.net/weixin_46640345/article/details/112783161