雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2011-04-27 22:19  huhuuu  阅读(322)  评论(0编辑  收藏  举报
求超级素数的过程比较简单
主要是求路径
用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[n]==9999999)
printf(
"0\n");
else
{
printf(
"%d\n",f[n]);
printf(
"%d",n-pa[n]);
n
=pa[n];
while(n)
{
printf(
" %d",n-pa[n]);
n
=pa[n];
}
printf(
"\n");
}
}