素数分解 dp

来源:互联网 发布:百度搜索合作网络 编辑:程序博客网 时间:2024/05/18 09:57
D - 调皮的小明
Time Limit:1000MS    Memory Limit:65535KB    64bit IO Format:
SubmitStatusPracticeNBUT 1580

Description

小明是个数学炒鸡棒的小学生, 精通200以内的加法,老师看不下去了,让小明去自学素数,这不,第二天,小明就回到学校,跟全班同学说他有一个问题,
把一个数分成一个或多个素数的和,有多少种情况。
9 = 2 + 2 + 2 + 3
9 = 2 + 7
9 = 2 + 2 + 5

9 = 3 + 3 + 3

所以有4种。

老师瞬间呆住了,这小明是吃错药了么。。。不过老师还是希望帮小明解决这个题目。请问你能帮助老师吗?答不出来,老师可是要叫家长咯……

Input

多组数据,每组数据输入一个N。2<= N <= 200

Output

输出分解的种类数.

Sample Input

89

Sample Output

34
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <climits>#include <cstring>#include <cmath>#include <map>#include <set>#define INF 100000000using namespace std;int a[300];int b[300];int dp[210][210];int fun(){for(int i = 2 ;i <= 200;i++){int flag = 0;for(int j = 2;j < i ;j++){if(i%j == 0){a[i] = 0;flag = 1;break;}}if(!flag){a[i] = 1;}}int j = 0;for(int i = 0;i <= 200;i++){if(a[i]){b[j++] = i;}}b[j] = INF;} int main(){fun();memset(dp,0,sizeof(dp));for(int i = 0;i <= 200;i++){dp[0][i] = 1 ;} for(int i = 2;i <= 200;i++){for(int j = 0;b[j] <= 200;j++){if(b[j] > i){dp[i][j] = dp[i][j-1];continue;}if(j == 0){dp[i][j] = dp[i-b[j]][j];}else{dp[i][j] = dp[i-b[j]][j] + dp[i][j-1];}}}int n;while(cin >> n){int i ;for(i = 0;b[i] <= n;i++){}i--;cout << dp[n][i] << endl;}return 0;}


0 0
原创粉丝点击