简单题,直接dfs即可。
#include <stdio.h>
int n,a[30],f[50],g[30];
void print()
{
int i;
printf("1");
for (i=2;i<=n;i++) printf(" %d",a[i]);
printf("\n");
}
void dfs(int t)
{
int i;
if ((t>n)&&(f[a[n]+1])) {print(); return;}
for (i=2;i<=n;i++)
if ((g[i])&&(f[i+a[t-1]]))
{
g[i]=0; a[t]=i;
dfs(t+1);
g[i]=1;
}
}
int main()
{
int i,j,count=0;
while (scanf("%d",&n)!=EOF)
{
for (i=2;i<=2*n;i++) f[i]=1;
f[0]=f[1]=0;
for (i=2;i<=2*n;i++)
if (f[i])
{
j=i+i;
while (j<=50) {f[j]=0; j+=i;}
}
for (i=2;i<=n;i++) g[i]=1;
g[1]=0; a[1]=1;
count++;
printf("Case %d:\n",count);
dfs(2);
printf("\n");
}
return 0;
}