dp[j][k]表示用j个质数表示k这个值得方法数。
一个质数只能用一次,类似01背包。
#include<cstdio> #include<cstring> const int maxn=1130; int pri[maxn+10],dp[20][maxn+10]; void init() { int i,j; for(i=0;i<=maxn;i++) pri[i]=1; pri[0]=pri[1]=0; for(i=2;i<=maxn;i++) { if(!pri[i]) continue; for(j=i+i;j<=maxn;j+=i) pri[j]=0; } } int main() { init(); int i,j,k,m,n; while(scanf("%d%d",&n,&m)&&(n||m)) { memset(dp,0,sizeof dp); dp[0][0]=1; for(i=2;i<=n;i++) { if(!pri[i]) continue; for(k=n;k>=i;k--) for(j=m;j>0;j--) dp[j][k]+=dp[j-1][k-i]; } printf("%d\n",dp[m][n]); } return 0; }
时间: 2024-10-10 00:53:10