• P1832 A+B Problem(再升级)


    P1832 A+B Problem(再升级)

    题目背景

    ·题目名称是吸引你点进来的

    ·实际上该题还是很水的

    题目描述

    ·1+1=? 显然是2

    ·a+b=? 1001回看不谢

    ·哥德巴赫猜想 似乎已呈泛滥趋势

    ·以上纯属个人吐槽

    ·给定一个正整数n,求将其分解成若干个素数之和的方案总数。

    输入输出格式

    输入格式:

    一行:一个正整数n

    输出格式:

    一行:一个整数表示方案总数

    输入输出样例

    输入样例#1: 复制
    7
    输出样例#1: 复制
    3

    说明

    【样例解释】

    7=7 7=2+5

    7=2+2+3

    【福利数据】

    【输入】 20

    【输出】 26

    【数据范围及约定】

    对于30%的数据 1<=n<=10

    对于100%的数据,1<=n<=10^3

    洛谷题解:

    这题经过分析,可以看出是一个完全背包问题。

    for i=1..sushu(n) //sushu(n)表示1到n之间的素数个数

    for j=a[i]..n //完全背包

    f[j]=f[j]+f[j-a[i]];

    最后的结果就是f[n]

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #define read scanf //pascal后遗症
     6 #define write printf //pascal后遗症
     7 using namespace std;
     8 int n,a[1005];
     9 long long dp[1005];
    10 int sushu(int x) //统计一到x之间的素数个数
    11 {
    12     int flag[x+10];
    13     memset(flag,1,sizeof(flag));
    14     for(int i=2;i<=x;i++)
    15      {
    16          if (flag[i])
    17             for(int j=i*2;j<=x;j+=i)
    18              flag[j]=0;
    19      }
    20     int k=0;
    21     for(int i=2;i<=x;i++)    
    22      if (flag[i]) a[++k]=i;
    23     return k;
    24 }
    25 int main()
    26 {
    27     memset(dp,0,sizeof(dp));
    28     dp[0]=1;//什么都不选
    29     read("%d",&n); //pascal后遗症
    30      for(int i=1;i<=sushu(n);i++)
    31       for(int j=a[i];j<=n;j++) 
    32        dp[j]+=dp[j-a[i]];
    33     write("%lld",dp[n]); //pascal后遗症
    34 }
  • 相关阅读:
    专题页移动端适配实例
    iconfont字体图标使用方法
    HBuilder常用快捷键
    tab
    tab-qq
    微信小程序之购物车功能
    margin塌陷
    weui-wxss-master下载地址
    python_vlc 播放http流
    go学习笔记-简述
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7747886.html
Copyright © 2020-2023  润新知