这道题用了,埃式筛选法和背包,我自己没有做出来,看了别人的代码,我也做不出来,特别是c[j]+=c[j-b[i]];弄了好久都没有弄懂。
这道题的解题思路:主要是先把150以内的所有素数找出来,存到一个数组里面,然后再用背包问题解决。
#include<stdio.h>
#include<string.h>
int a[151]={0},b[151],c[151];
//数组a存储数字的因子和,数组b存储素数,数组c存储每个数的分法
int main()
{
memset(c,0,sizeof(c));
int T,n,i,j,t=0;
for(i =1; i<151; i++)//筛选法
{
if(a[i]==1) b[t++]=i;//因子和为1的就是素数
for(j=2;i*j<151;j++)
a[i*j]+=i;
}
c[0]=1;
for( i=0;i<t;i++)//预处理,背包
for(j=b[i];j<151;j++)
c[j]+=c[j-b[i]];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",c[n]);
}
return 0;
}