20_1 解决下面的问题

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

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

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

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

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

套组合数公式就行了:C5417=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
C31×C52=3×10=30

(2)、文科2、理科1
C32×C51=3×5=15

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

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

答:排列问题,第一个箱子有4种放法,第二个箱子有3种放法,第三个箱子有2种放法,乘法原理 4×3×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)×9/2=45

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

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

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

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

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

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

第一位如果不是4,那么有9种可能性。第二位如果不是4,也是9种可能性,...
所以,根据乘法原理,就是9×9×9×9=6561 种,那么,有4的可能性就是100006561=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×2×2...=210
第二问:10个里面挑选4个位置放1,就是C104=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 @   糖豆爸爸  阅读(97)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-08-23 学习OpenResty编程
Live2D
点击右上角即可分享
微信分享提示