问题标题: 酷町堂:3012 素数入门

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

3012   素数入门

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

题目描述 Description

素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。现给定一个正整数n,求将其分解成若干个素数之和的方案总数。

输入描述 Input Description

一行:一个正整数n

输出描述 Output Description

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

样例输入 Sample Input

7

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

【样例解释】

7=7 7=2+5

7=2+2+3

【福利数据】

【输入】 20

【输出】 26

【数据范围及约定】

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

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

 

 

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

 

WA了,20分

张恩泽在2021-08-08 17:18:54追加了内容

只要这道题写出来了,那1105也就写出来了,几乎一样

张恩泽在2021-08-08 17:18:58追加了内容

只要这道题写出来了,那1105也就写出来了,几乎一样

张恩泽在2021-08-15 08:22:51追加了内容
//CODE
//#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n;
int cnt;
int f[50000];
bool is_prime(int n) {
	if (n == 1) {
		return false;
	}
	for (int i = 2; i <= sqrt(n); i ++) {
		if (n % i == 0) {
			return false;
		}
	}
	return true;
}
int prime(int n) {
	int c; 
	for (int i = 1; i <= n; i ++) {
		if (is_prime(i)) {
			c ++;
		}
	}
}
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	cin >> n;
	int cnt = prime(n);
	for (int i = 2; i <= cnt; i ++) {
		for (int j = i; j <= n; j ++) {
			if (is_prime(i)) {
				f[j] = max(f[j - i] + 1, f[j]);
			}
		}
	}
	cout << f[n];
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
}

又判断了一下i是不是质数,可还是不对


0
已采纳
刘乐宸
刘乐宸
新手天翼
新手天翼

@张恩泽 你完全背包循环连状态都没有判断,你只是在不断找,行就放,不行就丢。我觉得你应当先把数组排个序啊,贪心思路,尽量取大的啊。

刘乐宸在2021-08-15 13:20:54追加了内容

从大到小排个序即可

0
汪恺恒
汪恺恒
中级启示者
中级启示者

这是让你求方案总数,不是最大价值

递推式改成

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

 

0
0
0
刘乐宸
刘乐宸
新手天翼
新手天翼

题目没说只选两个数啊。所以这题用背包写,完全背包。

完全背包模板

for(int i=1;i<=n;i++)
        for(int j=w[i];j<=m;j++)
            f[j]=max(f[j],f[j-w[i]]+v[i]);

 

0
我要回答