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;
}

浙公网安备 33010602011771号