#include<stdio.h>
int main()
{
int i,j,n,f[21][191];
//f[i][j]表示i条边时,是否能产生j个结点,能,返回1,不能,返回0
for(i=0;i<21;i++)
for(j=0;j<191;j++)
f[i][j]=(j==0);
//f[i][0]都置1
for(n=2;n<21;n++)
for(i=n-1;i>=1;i--)
for(j=0;j<191;j++)
if(f[n-i][j]==1)
f[n][j+(n-i)*i]=1;
//如果f[n][x]==1
//f[n][x+((n-i)*i)]=1
while(scanf("%d",&n)!=EOF)
{
printf("0");
for(j=1;j<=n*(n-1)/2;j++)
if(f[n][j])
printf(" %d",j);
printf("/n");
}
return 0;
}
一. N条直线把空间分成几部分
现在说地是空间了, 不是平面了,要注意!
我们来讨论一下吧
点分线(0维分1维):C(N,1)+C(N,0)
线分面(1维分2维):C(N,2)+C(N,1)+C(N,0)
面分空间(2维分3维):C(N,3)+C(N,2)+C(N,1)+C(N,0)
如果n维划分有意义,同理可以推广!
我解释一下上面地公式吧
N个点最多把直线分成C(n,0)+C(n,1)份
N条直线最多把平面分成C(n,0)+C(n,1)+C(n,2)份
N个平面最多把空间分成
C(n,0)+C(n,1)+C(n,2)+C(n,3)=(n^3+5n+6)/6份;
N个空间最多把“时空”分成
C(n,0)+C(n,1)+C(n,2)+C(n,3)+C(n,4)份;
……
依此类推下去就行!