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 因此错了,注意背包一开始都是空的,然后一个一个物品地放