排列组合问题

排列组合A(n,m)

A(n,m);
n>=m

测试样例:

输入:
6
3
输出:
123 124 125 126 132 134 135 136 142 143
145 146 152 153 154 156 162 163 164 165
213 214 215 216 231 234 235 236 241 243
245 246 251 253 254 256 261 263 264 265
312 314 315 316 321 324 325 326 341 342
345 346 351 352 354 356 361 362 364 365
412 413 415 416 421 423 425 426 431 432
435 436 451 452 453 456 461 462 463 465
512 513 514 516 521 523 524 526 531 532
534 536 541 542 543 546 561 562 563 564
612 613 614 615 621 623 624 625 631 632
634 635 641 642 643 645 651 652 653 654

120

代码如下:

#include <stdio.h>
int m,n,a[30];
long s=0;
int main(){
    int p(int k);
    //输入A(n,m)的值 n>=m 
    scanf("%d",&n);
    scanf("%d",&m);
    p(1);
    printf("\n");
    printf("%ld",s);
    return 0;
}
int p(int k)
{
    int i,j,u;
    if(k<=m)
    {
        for(i=1;i<=n;i++)
        {
            a[k]=i;
            for(u=0,j=1;j<=k-1;j++){
                if(a[k]==a[j])
                u=1;
            }
            if(u==0){
                if(k==m){
                    s++;
                    printf(" ");
                    for(j=1;j<=m;j++)
                        printf("%d",a[j]);
                    if(s%10==0)
                        printf("\n");
                }else{
                    p(k+1);
                }
            }
        }
    }
    return s;
}
/*效率有点慢,A(11,10) 需要八秒*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值