穷举法也称为暴力破解法,简单来说就是举出所有的情况例子。
下面来看三个典型应用例题:
1.两个乒乓球队进行比赛,各出3人。甲队为 A,B,C 3人,乙队为 X,Y,Z 3人。巳抽签决定比赛名单,有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序输出3对赛手的名单 。
int main() {
for (char a = 'X'; a <= 'Z'; a++)//A的所有对手
{
for (char b = 'X'; b <= 'Z'; b++)//B的所有对手
{
for (char c = 'X'; c <= 'Z'; c++)//C的所有对手
{
if (a != 'X' && c != 'X' && c != 'Z' && a != b && a != c && b != c) {
printf("A->%c,B->%c,C->%c", a, b, c);
}
}
}
}
return 0;
}
2.有1元,5元,10元的人民币若干,现在需要18元,一共有多少种组合情况?
int main() {
int count = 0;//统计组合
for (int a = 10, x = 0; x < 2; x++) {
for (int b = 5, y = 0; y < 4; y++) {
for (int c = 1, z = 0; z < 19; z++) {
if (a * x + b * y + c * z == 18) {
count++;
printf("%d张10元,%d张5元,%d张1元\n", x, y, z);
}
}
}
}
printf("一共有%d种组合", count);
return 0;
}
3.在一个陌生的国度,有5种不同的硬币单位:15、23、29、41和67(分)。
寻找所有组成18元8分(即1808分)的可能组合。假定对于所有面值的硬币你都有足够的硬币(此题的组合情况较多)。
int main() {
int count = 0;
for (int a = 15, p = 0; p <= (1808 / a); p++) {
for (int b = 23, q = 0; q <= (1808 / b); q++) {
for (int c = 29, x = 0; x <= (1808 / c); x++) {
for (int d = 41, y = 0; y <= (1808 / d); y++) {
for (int e = 67, z = 0; z <= (1808 / e); z++) {
if (a * p + b * q + c * x + d * y + e * z == 1808) {
count++;
printf("%d个15分,%d个23分,%d个29分,%d个41分,% d个67分\n",
p, q, x, y, z);
}
}
}
}
}
}
printf("一共有%d种可能组合\n", count);
return 0;
}