• 洛谷 [AHOI2001]质数和分解


     题目描述 Description
    任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质
    数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一
    种质数和的形式。例如,9 的质数和表达式就有四种本质不同的形式:
    9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 。
    这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中
    参加和运算的各个数的位置而直接得到另一个表达式。
    试编程求解自然数 n 可以写成多少种本质不同的质数和表达式。
     输入输出格式 Input/output
    输入格式:
    文件中的每一行存放一个自然数 n(2 < n < 200) 。
    输出格式:
    依次输出每一个自然数 n 的本质不同的质数和表达式的数目。
     输入输出样例 Sample input/output
    样例测试点#1
    输入样例: 

    2
    200

    输出样例:

    1
    9845164

    思路:这是一个恰好放满的完全背包,为了恰好放满,我们让f[0]=1(这个应该可以理解),完全背包的话,用质数准备物品,背包从a[i]循环到满,就是这个原因!。

    注意:内循环从a[i]开始,可以防止正反调换顺序后的重复

    #include<iostream>
    using namespace std;
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    int n,t=0;
    int a[201];
    bool judge(int k)
    {
        bool flag=true;
        for(int i=2;i<=sqrt(k);++i)
        if(k%i==0)
        {
            flag=!flag;
            break;
        }
        return flag;
    }
    void zhishu()
    {
        for(int i=2;i<=200;++i)
        if(judge(i))
        {
            ++t;
            a[t]=i;
        }
    }
    int f[201];
    int main()
    {
        
        zhishu();
        while(scanf("%d",&n)==1)
        {
            memset(f,0,sizeof(f));
            f[0]=1;
           for(int i=1;i<=t;++i)//所有的可以用的质数 
             for(int j=a[i];j<=n;++j)
             f[j]+=f[j-a[i]]; /*DP方程的思路:f[j]等于所有可以通过j-一个质数的方案总和*/
             cout<<f[n]<<endl;
       }
        return 0;
    }
    View Code
  • 相关阅读:
    数据加载存储和文件格式
    基本概率分布图的绘制
    pandas处理各类表格数据
    python时间处理
    matplotlib实现数据可视化
    sql学习笔记:表的运算
    sql杂记:一些坑和数据库恢复
    exists关键词和case表达式
    后台工具screen
    SQL函数小记
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5325081.html
Copyright © 2020-2023  润新知