1 条题解

  • 0
    @ 2025-8-24 21:30:50

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar hmh13951417981
    这个蒟蒻很懒,什么都没留下

    搬运于2025-08-24 21:30:50,当前版本为作者最后更新于2019-02-18 22:20:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思想贴上:

    既然说要都用素数,必须先筛出素数

    如果是素数,就要判断是否取

    每个素数可以无限取-->完全背包

    记得结果会很大一定要开long long


    #include<bits/stdc++.h>
    using namespace std;
    int i,j,n;
    long long dp[1001];//dp数组存储第i个数的组成种数
    bool b[1001];//b数组判断是否为素数
    void prime(){
    	for(i=2;i<=500;i++)
    		if(!b[i])
    			for(j=2;i*j<=1000;j++)
    				b[i*j]=1;
    }//筛法
    int main()
    {	prime();//预处理,筛出素数
    	cin>>n;//输入
        //完全背包经典代码
    	dp[0]=1;//边界值:当取数和为0时值为1
    	for(i=2;i<=n;i++)//循环每个数取或不取
    		if(!b[i])//是素数才能考虑是否能取
    		for(j=i;j<=n;j++)//从i开始到n,因为你要得到的数肯定不小于取的数
    			dp[j]+=dp[j-i];////取这个素数,则减去这个素数方案数累加到总方案数
    	cout<<dp[n];//输出n的方案数
      	return 0;
    }
    
    • 1

    信息

    ID
    802
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者