需理解求方案数的dp是咋实现的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 10;
bool st[N];
int primes[N];
int cnt;
ll f[N];
int main(){
for(int i = 2; i <= 1000; i++){
if(!st[i]) primes[cnt++] = i;
for(int j = 0; primes[j] <= 1000/i; j++){
st[i*primes[j]] = 1;
if(i % primes[j] == 0) break;
}
}
// for(int i = 0; i < cnt; i++){
// printf("primes[%d]=%d\n",i,primes[i]);
// }
int n;
cin >> n;
f[0] = 1;
for(int i = 2; i <= n; i++){
if(!st[i]){//若i为素数,则可以选用
for(int j = i; j <= n; j++){//因可以多次选取同一个素数,所以为完全背包。
//范围从当前可选值,到最大值。
f[j] += f[j - i];
}
}
}
cout << f[n] << endl;
return 0;
}