蓝桥 质数拆分 dp python

想说的话

大家好🌼🌼,我是 @愿此后再无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])

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿此后再无WA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值