背包有些生疏了,尽管很快就推出了转移方程,但却调了有一会儿 #include <iostream> #include <algorithm> using namespace std; int dp[1200][16],p[1000],i,j,k,pnum,a,b; bool f[1200]; int main() { pnum=0; memset(f,true,sizeof(f)); memset(p,0,sizeof(p)); for (i=2;i<=1130;i++) if (f[i]) { pnum++; p[pnum]=i; for (j=i*2;j<=1130;j+=i) f[j]=false; } memset(dp,0,sizeof(dp)); dp[0][0]=1; for (i=1;i<=pnum;i++) for (j=1130;j>=p[i];j--) for (k=1;k<=14;k++) if (j-p[i]>=0) dp[j][k]+=dp[j-p[i]][k-1]; while (1) { scanf("%d%d",&a,&b); if (a==0 && b==0) break; printf("%d/n",dp[a][b]); } system("pause"); return 0; }