1. 程式人生 > 其它 >10屆國賽java試題 B: 質數拆分

10屆國賽java試題 B: 質數拆分

技術標籤:動態規劃python

質數拆分


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

禁止轉載。僅用於自己學習。對程式錯誤不負責。