10屆國賽java試題 B: 質數拆分
阿新 • • 發佈:2021-02-05
質數拆分
將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])
禁止轉載。僅用於自己學習。對程式錯誤不負責。