题目
将 20192019 拆分为若干个两两不同的质数之和,一共有多少种不同的方法?
注意交换顺序视为同一种方法,例如 2+2017=2019 与2017+2=2019 视为同一种方法。
思路
之前写过类似的题目,X进制减法&&2022_pepsi_w的博客-CSDN博客 。发现是背包问题!不会写这个,数组含义都记不住!然后看了一下题解,感觉还是不太会的亚子。
代码
import os
import sys
# 请在此输入您的代码
import math
nums = [] #先找出2019以内的质数
for i in range(2, 2018):
for j in range(2, i):
if i%j == 0:
break
else:
nums.append(i)
dp = [0 for i in range(2020)]
num = 2019
s = len(nums)
dp[0] = 1 # 进行初始化
for i in range(s):
for j in range(num, nums[i]-1, -1):
# 质数要求两两不同,所以装下p[i]后就不能再用了,所以直接除去它
dp[j] += dp[j-nums[i]]
print(int(dp[2019]))
题目
20 个圆和20 条直线最多能把平面分成多少个部分?
思路
找不到规律,看了题解。思路如下:
还有直接写公式的:
#直线与圆共同分割平面的公式(m:圆,n:直线):f(m,n)=m^2-m+2+2mn+1/2*n^2+1/2*(n) -1
代码
import os
import sys
# 请在此输入您的代码
lines = 20 # n = 已有平面个数+交点个数+1
cirl = 20
a = [[0 for i in range(21)]for i in range(21)] #n[i][j] i表示直线个数 j表示圆个数
a[0][0] = 1 #初始有一个平面
for i in range(1, 21):
a[i][0] = a[i-1][0] + i
for j in range(1, 21):
a[i][j] = a[i][j-1] + 2 * (j-1) + 2 * i #目前已有j-1个圆 i条直线
print(a[20][20])