20_1 解决下面的问题
1、从10个人里面取4个,排成一排,有多少种排法?
答:共4个位置,第一个位置有10种选法,第二个位置有9种选法,第三个位置有8种选法,第四个位置有7种选法。
共
2、3个人玩斗地主(共54张扑克牌,每张牌都有各自的花色和大小,所以每张牌都是不一样的),小止是农民(持有17张牌)。小止持有的这一组牌,共有多少种可能的情况?
答:首先判断是排列还是组合,如果最终17张牌的顺序与结果有关,就是排列,无关就是组合。
很显然,不管手中的17张牌怎么摆,对小止来说都是一样的,就是,与顺序无关,是组合。
套组合数公式就行了:
#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、学校提供门文科选修课,门理科选修课,学生要选择门课,要求文科和理科至少各选择一门。请问:有几种选择方式?
答:至少各一门,分情况讨论:
(1)、文科1,理科2
种
(2)、文科2、理科1
种
再根据加法原理:种
5、将4个不同的小球放入3个不同的箱子中,一共有几种方法?
答:排列问题,第一个箱子有4种放法,第二个箱子有3种放法,第三个箱子有2种放法,乘法原理 种。
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
就是
7、彩票可以从28个数字中选择5个不同的数字,顺序无关,每注彩票2元,如果要求确保中头奖(五个数字全中),需要花多少钱购买彩票?
答:顺序无关,说明是组合问题,非排列问题。一注2元,需要计算出需要多少注,然后再乘以2就可以。
(1)要保证数字a(1~28)肯定会出现的话,那么()肯定要全买。
(2)因为不能重复,所以,数字b(),就需要在()上全买。
(3) 以此类推,就是注
(4) 因为每注两元,还需要乘以2,就是元
8、某地车牌号由4位数字组成,如果其中至少有一位带有数字4,则认为是“不吉利”的。请问:一共有多少个“不吉利”的号码?
答: 正向思考所有带4的可能性,会出现重复的情况,不好想。
下面来使用反着想的办法,就是逆向思维,找到所有不包含4的情况:
第一位如果不是4,那么有9种可能性。第二位如果不是4,也是9种可能性,...
所以,根据乘法原理,就是 种,那么,有4的可能性就是个。
附上验证的代码:
#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个就是
第二问:10个里面挑选4个位置放1,就是
代码验证一下:
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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编程