停课day1

Posted on 2017-06-12 09:46  Amphetamine  阅读(92)  评论(0编辑  收藏  举报

一早上只做了一个calculator 还是参照题解,好惭愧

f[1]=0; flag[1]=true;
    for (int i=2,N=num[n];i<p;i++) {
        for (int j=1,w=1;num[j]*i<=N;j++)
            if (f[j]+i<p) {
                while(num[w]!=num[j]*i)++w;
                f[w]=min(f[w],f[j]+1);
                flag[w]=true;
            }
    }

说一下核心部分 f[i]表示的是第i个数,最少乘的次数,flag表示是否被选中

对于一个f[j]+i<p也就是说f[j]+i+1<=p num[j]*i这个数可以被选到,由于之前sort了所以对于每次循环,从小到大搜就可以啦

这个算法解决了我之前的疑问就是如果乘10次2不如乘5次4,i是从2到p-1遍历的,不都是质数,所以也包含着几个质数的积的形式。