一早上只做了一个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遍历的,不都是质数,所以也包含着几个质数的积的形式。