XTU-OJ 《C语言程序设计》 1257-0和1

本文分析了给定条件下的01字符串排列问题,利用组合数学原理计算可能的排列数,并提供了C(n,(n-m)/2)的代码示例。

题目描述

一个01字符串,长度是n,其中1比0多m个,请问不同的排列方案数有多少个?

输入

第一行是一个整数K,表示样例的个数。 以后每行两个整数n和m,1≤n≤33,0≤m≤n。

输出

每行输出一个样例的结果。

样例输入

4
2 0
2 1
3 0
3 1

样例输出

2
0
0
3

线索

第一个样例为"01"和"10";第二、三个样例不存在这样的串;第四个样例为"011","101","110"

解题思路:  本题就是一道纯粹得不能再纯粹的数学题——0和1的排列组合。  

先验证 1比0多m个 的串是否存在,如果存在,利用组合数的知识,在 n 个数里面找  (n-m)/2 个 0 —— C(n,(n-m)/2 ).

AC代码:

#include <stdio.h>

const int N = 35;
__int64 YHtriangle[N][N];

void printangle()
{
    for (int i = 0; i < N; i ++)
        YHtriangle[i][0] = YHtriangle[i][i] = 1;
    for (int i = 2; i < N; i ++)
        for (int j = 1; j < i; j ++)
            YHtriangle[i][j] = YHtriangle[i-1][j-1] + YHtriangle[i-1][j];
}

int main()
{
    printangl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值