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 }
原文地址:https://www.cnblogs.com/Renyi-Fan/p/7747886.html