f[n]+=f[n-素数]
正确的代码:
#include <bits/stdc++.h>
using namespace std;
const int N=207,INF=203;
int cnt,dp[N],n;
long long prime[N];
bool st[N];
void mTable(){
for(int i=2;i<INF;i++){
if(!st[i]) prime[cnt++]=i;
for(int j=0;prime[j]<=INF/i;j++){
st[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}//线性筛法
dp[0]=1;
for(int i=0;i<cnt;i++){
for(int j=prime[i];j<=200;j++){
dp[j]+=dp[j-prime[i]];
}
}//打表
}
int main(int argc, char** argv) {
mTable();
while(cin>>n){
cout<<dp[n]<<endl;
}
return 0;
} void mTable(){
for(int i=2;i<INF;i++){
if(!st[i]) prime[cnt++]=i, dp[i]=1;<<<<<<--------
for(int j=0;prime[j]<=INF/i;j++){
st[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
此处无dp[0]=1;<<<<--------------
for(int i=0;i<cnt;i++){
for(int j=prime[i];j<=200;j++){
dp[j]+=dp[j-prime[i]];
}
}
} 这里错在背包都是一个一个物品放的,这里由于先在dp里放了,所以比如5,这里由于2和3一开始2和3是素数所以dp[2],dp[3]是1;那么在循环时循环for(int i=2 ,3)时两遍都加了 所以5=2+3=3+2=5 因此错了,注意背包一开始都是空的,然后一个一个物品地放

京公网安备 11010502036488号