- 算法说明
求解201内,任意多个质数和为201的解的个数,构造向量解的过程
- 源代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 10000
#define M 201
int prime[maxn], isPri[maxn], num = 0;
int x[maxn];
int ans = 0;
bool isPrime(int n) {
int sqr = sqrt(n * 1.0);
for(int i = 2; i <= sqr; i++) {
if(n % i == 0) {
return false;
}
}
return true;
}
void findPrimeOL(int n) {
for(int i = 2; i <= n; i++) {
if(isPri[i]) {
prime[num++] = i;
}
for(int j = 0; j < num; j++) {
if(prime[j] * i > n) break;
isPri[prime[j] * i] = false;
if(i % prime[j] == 0) break;
}
}
}
void subset(int sum, int remaining, int k) {
x[k] = 1;
if(sum + prime[k] == M) {
ans++;
}
else if(sum + remaining >= M && sum + prime[k] + prime[k + 1] <= M) {
subset(sum + prime[k], remaining - prime[k], k + 1);
}
x[k] = 0;
if(sum + remaining - prime[k] >= M && sum + prime[k + 1] <= M) {
subset(sum, remaining - prime[k], k + 1);
}
}
int main() {
memset(prime, 0, sizeof(prime));
memset(isPri, -1, sizeof(isPri));
memset(x, 0, sizeof(x));
findPrimeOL(M);
int remaining = 0;
for(int i = 0; i < num; i++) {
remaining += prime[i];
}
subset(0, remaining, 0);
printf("ans = %d", ans);
return 0;
}
- 运行结果