想说的话
大家好🌼🌼,我是 @愿此后再无WA,可以叫我小A,也可以叫我愿愿💡💡,一位阳光帅小伙,对算法领域比较感兴趣。如果我的文章对您有用,欢迎持续关注,我们一起进步!🎈🎈
很抱歉各位😪😪,现离蓝桥杯比赛不到一个月时间,我临时改变了计划,转为全心备战蓝桥,因为这个省一对我来说太重要了,也是我最后一次机会,我一定要拿到手📌📌,那么这样的话我在博客上花的时间就会少了很多,也将导致博客文章质量明显下降,在此我给大家说声抱歉💥💥
🌟🌟这些日子我真的很开心,博客上能遇到一群志同道合的兄弟姐妹真的很幸福,没有你们的支持与鼓励我早就坚持不下去了,因为有你们我才能走的更远☀️☀️熬过这段时期我一定会回来的,爱你们❤️❤️
质数拆分
吐槽
这是国赛题喔,我感觉我看题目老是看一半不看一半,总是能看错题目…一开始我以为是拆分成两个不同质数的和, 这也太简单了吧?难不成是签到题?哗啦哗啦两三分钟就写完了,打印结果才发现是一种,提交了一下果然错了。
郁闷了好久不知道哪里有问题,幸亏白忙活二十分钟后又审了一下题,原来是若干个!懂了。原来是凑数问题,不过最近遇到太多凑数问题了,这应该难不倒我哈哈。
思路
凑数问题当然是用dp了。首先将所有质数存放到列表中,质数的话看除1外有没有能被整除的数,有的话就不是质数,否则就是有质数。
拿到质数后就开个长度为质数+1的数组,我从二维dp角度讲吧,dp[i][j]表示第前i个数能够凑出数字j的总数,而一维dp[j]表示第i个数能够凑齐数字j的总数,还要加上以前能够凑齐j的总数。也是一个意思,只要理解什么是滚动数组就ok,可以看一下carl的这个视频,讲的很详细。这里.
如果你不太明白我在说什么的话可能就要找找dp的教程视频看看了,我也是这么过来的。
当 i 与 j 相等时,i这个数就是j当然能凑出j,因此在此前的方案数加上1.
ij不等就看有没有能与i凑出j的数,也就是有没有j-i,有的话加上他的方案数即可。
代码
def is_prime(num):
for i in range(3,int(pow(num,0.5))+1,2):
if num % i == 0:
return False
return True
nums = [2,3,5,7]
target = 2019
for i in range(9,target+1,2):
if is_prime(i):
nums.append(i)
dp = [0 for i in range(target+1)]
for i in nums:
for j in range(target,i-1,-1):
if j == i:
dp[j] += 1
if j - i >= 0:
dp[j] += dp[j-i] # 如果要求位置不同也算的话就要乘了
print(dp[-1])