且未

博客园 首页 新随笔 联系 订阅 管理

题目

这道题用了,埃式筛选法和背包,我自己没有做出来,看了别人的代码,我也做不出来,特别是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;
}


posted on 2017-10-16 13:04  阿聊  阅读(154)  评论(0编辑  收藏  举报