一道排列组合题……会的解答一下
c语言吧
全部回复
仅看楼主
level 6
hack绝望 楼主
书架上有21本书,编号从1到21从中选4本,其中每两本的编号都不相邻的选法一共有多少种?
2009年10月16日 01点10分 1
level 0
C(18, 4)
还剩17本,相当于在18个空档中插入4本书,书不能占据同一位置
2009年10月16日 01点10分 2
level 0
1 3 5 2 也是不行的
2009年10月16日 02点10分 3
level 0
C(18, 4) = 3060
以上构造能保证不会相邻
2009年10月16日 02点10分 4
level 0
贴个算法让机器代劳吧!
main()                                  /*c(n,r)*/
{int a[30],i,j,n=21,r=4,sum=0;
for (j=1;j<=r;j++)a[j]=j;
for (j=1;j<=r;j++)printf("%2d ",a[j]);printf("\n");
do
{i=0;
for (j=1;j<=r;j++)if(a[j]<n-r+j&&j>i)i=j;
if (i>0){a[i]=a[i]+1;for (j=i+1;j<=r;j++)a[j]=a[j-1]+1;
if(a[1]+1<a[2]&&a[2]+1<a[3]&&a[3]+1<a[4]){for (j=1;j<=r;j++)
printf("%2d ",a[j]);printf("\n");sum++;}}}
while(i>0);
printf("c(%d,%d)=%d",n,r,sum);
}
3060正确
4楼的构造法得到验证
2009年11月29日 14点11分 5
1