• 洛谷 [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
  • 相关阅读:
    《跑跑跑》(五)——添加障碍物,Tiled障碍层的使用
    Cocos2d-JS 自定义loading界面
    Oracle本地,远程,分布式登录
    JUnit测试工具在项目中的用法
    js事件之神奇的onclick
    js常见事件
    JS & DOM 对象
    jquery方法的参数解读
    JDBC和DBUtils区别(查询时jdbc只能返回ResultSet需要po转vo,dbutils返回的BeanListHandler与BeanHandler对应集合与对象)
    AJAX技术的核心
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5325081.html
Copyright © 2020-2023  润新知