问题标题: 酷町堂:3266 整数的分解

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

3266   整数的分解

经验值:400 时间限制:1000毫秒

题目描述 Description

哥德巴赫猜想到现在也没有被证明:任何一个大于2的偶数,都可以写成两个素数之和;

三素数定理已被证明:任何一个大于等于7的奇数都能够写成三个素数之和。

你的任务不是去验证上述猜想和定理,而是求出:给定一个正整数,把它分解成若干个素数之和的形式,一共有多少种不同的分解方法。

例如7可以分解成1或2或3个素数之和:7 = 7 = 2 + 5 = 2 + 2 + 3,只有这三种分解方法,改变素数的顺序如7=3+2+2,不能算另一种方法。

输入描述 Input Description

一个整数N

输出描述 Output Description

一个整数,表示N最多有多少种分解方法

样例输入 Sample Input

20

样例输出 Sample Output

26

数据范围及提示 Data Size & Hint

对于10%的数据 N=1

对于30%的数据 1≤N≤10

对于100%的数据,1≤N≤1000

 

 

//CODE
//#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int n;
int f[1100][1100];
int zs(int n) {
	for (int i = 2; i <= sqrt(n); i ++) {
		if (n % i == 0) {
			return false;
		}
	}
	return true;
}
int dfs(int n, int t) {
	if (f[n][t] != -1) {
		return f[n][t];
	}
	if (n == 0) {
		return 1;
	}
	int ans = 0;
	for (int i = t; i <= n; i ++) {
		if (zs(i)) {
			ans += dfs(n - i, i);
		}
	}
	return f[n][t] = ans;
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	memset(f, -1, sizeof(f));
	cin >> n;
	cout << dfs(n, 2);
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

 

为什么50分?

张恩泽在2021-06-06 20:44:29追加了内容

顶!!

张恩泽在2021-06-07 22:24:22追加了内容

我再顶!


0
已采纳
杜承俊
杜承俊
资深守护
资深守护

这是作业啊

大哥

杰哥

0
甄子烨
甄子烨
高级光能
高级光能

emmm,这一题应该要记忆化搜索吧

0
周睿洋
周睿洋
新手守护
新手守护

你的素数判断函数应写成:

bool 判断函数(int n){    //或者是int 判断函数(int n)

     如果n等于2  返回true(或1)

     如果n小于2  返回false(或0)

     下面代码不变。 

}

我要回答