这道题用了,埃式筛选法和背包,我自己没有做出来,看了别人的代码,我也做不出来,特别是c[j]+=c[j-b[i]];弄了好久都没有弄懂。 这道题的解题思路:主要是先把150以内的所有素数找出来,存到一个数组里面,然后再用背包问题解决。
#include#include 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