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