20_1 解决下面的问题

1、从10个人里面取4个,排成一排,有多少种排法?

答:共4个位置,第一个位置有10种选法,第二个位置有9种选法,第三个位置有8种选法,第四个位置有7种选法。
\(s=10 \times 9 \times 8 \times 7 =5040\)

2、3个人玩斗地主(共54张扑克牌,每张牌都有各自的花色和大小,所以每张牌都是不一样的),小止是农民(持有17张牌)。小止持有的这一组牌,共有多少种可能的情况?

答:首先判断是排列还是组合,如果最终17张牌的顺序与结果有关,就是排列,无关就是组合。

很显然,不管手中的17张牌怎么摆,对小止来说都是一样的,就是,与顺序无关,是组合。

套组合数公式就行了:\(C_{54}^{17}=47153358767970\)

#include<cstdio>

using namespace std;
typedef long long LL;

//帕斯卡公式求组合数,与埃筛、欧筛类似,是预处理中好多,再慢慢用
const int N = 2010;  //n的数值上限
LL C[N][N]; //组合数数组
void C3() {
    //预处理杨辉三角形
    for (int i = 0; i < N; i++) {
        //base case
        C[i][0] = C[i][i] = 1; //组合数C(n,0)=1 组合数C(n,n)=c(n,0)=1
        //递推生成其它组合数
        for (int j = 1; j < i; j++)
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]);
    }
}

int main() {
    C3();
    printf("%lld\n", C[54][17]);
    return 0;
}

3、现有9元,购买面值分别为2元或者3元的邮票,每种邮票至少购买1张,一共有多少种购买方法?

答:分情况讨论
(1)一张2元,一张3元。 一张2元,两张3元。

(2)二张2元,一张3元。

(3)三张2元,一张3元。

没了,共4种。

4、学校提供\(3\)门文科选修课,\(5\)门理科选修课,学生要选择\(3\)门课,要求文科和理科至少各选择一门。请问:有几种选择方式?

答:至少各一门,分情况讨论:
(1)、文科1,理科2
\(C_3^1 \times C_5^2=3\times 10=30\)

(2)、文科2、理科1
\(C_3^2 \times C_5^1=3 \times 5=15\)

再根据加法原理:\(30+15=45\)

5、将4个不同的小球放入3个不同的箱子中,一共有几种方法?

答:排列问题,第一个箱子有4种放法,第二个箱子有3种放法,第三个箱子有2种放法,乘法原理 \(4 \times 3 \times 2=24\)种。

6、所有的两位数中,十位数大于个位数的有几个?

1X-> 10
2X-> 20 21
3X-> 30 31 32
4X-> 40 41 42 43

9X-> 90 91 92 93 94 95 96 97 98
就是\(1+2+3+4+...+9=(1+9)\times 9 /2=45\)

7、彩票可以从28个数字中选择5个不同的数字,顺序无关,每注彩票2元,如果要求确保中头奖(五个数字全中),需要花多少钱购买彩票?

答:顺序无关,说明是组合问题,非排列问题。一注2元,需要计算出需要多少注,然后再乘以2就可以。

(1)要保证数字a(1~28)肯定会出现的话,那么(\(1 \sim 28\))肯定要全买。
(2)因为不能重复,所以,数字b(\(1\sim 28\)),就需要在(\(1 \sim 27\))上全买。
(3) 以此类推,就是\(28\times 27 \times 26 \times 25\times 24=11,793,600\)
(4) 因为每注两元,还需要乘以2,就是\(11793600 \times 2=23,587,200\)

8、某地车牌号由4位数字组成,如果其中至少有一位带有数字4,则认为是“不吉利”的。请问:一共有多少个“不吉利”的号码?

答: 正向思考所有带4的可能性,会出现重复的情况,不好想。

下面来使用反着想的办法,就是逆向思维,找到所有不包含4的情况:

第一位如果不是4,那么有9种可能性。第二位如果不是4,也是9种可能性,...
所以,根据乘法原理,就是\(9 \times 9 \times 9 \times 9=6561\) 种,那么,有4的可能性就是\(10000-6561=3439\)个。

附上验证的代码:

#include <bits/stdc++.h>

using namespace std;
int cnt;

int main() {
    for (int i = 0; i <= 9; i++)
        for (int j = 0; j <= 9; j++)
            for (int k = 0; k <= 9; k++)
                for (int p = 0; p <= 9; p++)
                    if (i == 4 || j == 4 || k == 4 || p == 4)
                        cnt++;
    cout << cnt;
    return 0;
}

再来一个验证代码

#include <bits/stdc++.h>

using namespace std;
int cnt;

int main() {
    for (int i = 10000; i <= 19999; i++) {
        int n = i;
        while (n) {
            if (n % 10 == 4) {
                cnt++;
                break;
            }
            n /= 10;
        }
    }
    cout << cnt << endl;
    return 0;
}

9、长度为10的布尔数组,有多少种取值情况?共有多少个长度为10的布尔数据组,它里面恰好有4个"1"?

答:
第一问:乘法原理,每个位置是2种,10个就是\(2\times 2 \times 2 ...=2^{10}\)
第二问:10个里面挑选4个位置放1,就是\(C_{10}^4=210\)
代码验证一下:

#include <bits/stdc++.h>

using namespace std;
int cnt;

int main() {
    int n = 10;
    int u = 1 << n;
    for (int s = 0; s <= u - 1; s++) {
        int q = 4;
        for (int i = n - 1; i >= 0; i--)
            if (s & (1 << i)) q--;
        if (!q)cnt++;
    }
    cout << cnt << endl;
    return 0;
}
posted @ 2021-08-23 16:17  糖豆爸爸  阅读(115)  评论(0)    收藏  举报
Live2D