for(int i = 1;i <= cnt;i++) {
for(int j = 1;j <= n;j++) {
f[i][j] = f[i-1][j] + f[i][j-prime[i]];
}
}
cout << f[cnt][n];
第二个点就错了,只得了60分
把数组改成一维就OK了
for(int i = 1;i <= cnt;i++) {
for(int j = prime[i];j <= n;j++) {
f[j] = f[j] + f[j-prime[i]];
}
}
cout << f[n];
想了很久,还是不太明白是怎么回事,求大神指点。
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int n,cnt = 1;
int isprime[1005];
int prime[1005];
long long f[1005][1005];
void aishishai(int n) {
for(int i = 2;i*i <= n+1;i++) {
if(isprime[i] == 0) {
for(int j = 2*i;j <= n;j += i) {
isprime[j] = 1;
}
}
}
for(int i = 2;i <= n;i++) {
if(isprime[i] == 0) {
prime[cnt++] = i;
}
}
cnt--;//质数从数组下标1开始
}
int main( ) {
cin >> n;
aishishai(n);
//for(int i = 1;i <= cnt;i++) {
// cout << prime[i] << " ";
//}
//数组初始化 f[i][0] = 1
for(int i = 0;i <= cnt;i++) f[i][0] = 1;
for(int i = 1;i <= cnt;i++) {
for(int j = 1;j <= n;j++) {
f[i][j] = f[i-1][j] + f[i][j-prime[i]];
}
}
cout << f[cnt][n];
return 0;
}