您的位置:首页 > 其它

完全背包记录路径——sgu 116. Index of super-prime

2011-04-27 22:19 411 查看
求超级素数的过程比较简单
主要是求路径
用pa[]随时记录前驱,就好了
View Code

#include<stdio.h>
#include<math.h>

int prim[109];
int f[109];
int pa[109];
bool rprim[109];

int isprim(int a)
{
int t=sqrt(a*1.0);
int i;
for(i=2;i<=t;i++)
{
if(a%i==0)
return 0;
}
return 1;
}

int main()
{
int n;
scanf("%d",&n);
int i,add=1;
for(i=1;i<=n;i++)
f[i]=9999999;
f[0]=0;

for(i=2;i<=n;i++)
{
if(isprim(i)==1)
{
rprim[i]=1;
prim[add]=i;
add++;
}
}
int add1=1;
for(i=1;i<=add;i++)
{
if(rprim[i]==1)
{
prim[add1]=prim[i];
add1++;
}
}//选超级素数

int j;
for(j=0;j<n;j++)
{
for(i=1;i<add1&&prim[i]+j<=n;i++)
{
if(f[j]+1<f[j+prim[i]])
{
f[j+prim[i]]=f[j]+1;
pa[j+prim[i]]=j;
}
}
}

if(f
==9999999)
printf("0\n");
else
{
printf("%d\n",f
);
printf("%d",n-pa
);
n=pa
;
while(n)
{
printf(" %d",n-pa
);
n=pa
;
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: