暴力枚举
T1
百鸡问题
时间限制:1 秒
内存限制:32 兆
特殊判题:否
题目描述: 用小于等于 n 元去买 100 只鸡,大鸡 5 元/只,小鸡 3 元/只,还有 1/3 元每只的一种小鸡,分别记为 x 只,y 只,z 只。编程求解 x,y,z 所有可能解。
输入: 测试数据有多组,输入 n。
输出: 对于每组输入,请输出 x,y,z 所有可行解, 按照 x, y, z 依次增大的顺序输出。
样例输入:
40
样例输出:
x=0,y=0,z=100
x=0,y=1,z=99
x=0,y=2,z=98
x=1,y=0,z=99
//
// main.cpp
// HundredChick
//
// Created by Apple on 2019/8/26.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <stdio.h>
using namespace std;
int main(int argc, const char * argv[]) {
// insert code here...
int n;
while(scanf("%d", &n) != EOF){
for(int x = 0;x <= 100;x++){
for(int y = 0;x + y <= 100;y++){
int z = 100 - x - y;
if(15 * x + 9 * y + z > 3 * n)
continue;
printf("x = %d, y = %d, z = %d\n", x, y, z);
}
}
}
return 0;
}
暴力枚举三要素
- 查找空间:在枚举问题中,所有可能构成答案的解组成了其查找空间,枚举过程即枚举查找空间的每一个解,枚举过程中,要做到不遗漏不重复,
- 查找目标:查找到一组符合问题问题要求的解--------对枚举的每一个解进行判定
- 查找方式:简单的一次遍历所有的解,直到符合要求
递归
T2
递归:函数调用函数本身
注意:避免递归无限发生,设置结束出口,当函数到达某种条件时停止递归
//求 n 阶层的递归程序
int F(int x){
if(x == 0)
return 1;
return x * F(x - 1);
}
汉诺塔 III
时间限制:1 秒
内存限制:32 兆
特殊判题:否
题目描述: 约 19 世纪末, 在欧州的商店中出售一种智力玩具, 在一块铜板上有三根杆, 最左边的杆上自上而下、由小到大顺序串着由 64 个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上, 条件是一次只能移动一个盘, 且不允许大盘放在小盘的上面。现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。Daisy 已经做过原来的汉诺塔问题和汉诺塔 II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有 N 个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?
输入: 包含多组数据,每次输入一个 N 值(1<=N=35)。
输出: 对于每组数据,输出移动最小的次数。
样例输入:
1
3
12
样例输出:
2
26
531440
//
// main.cpp
// Hannota
//
// Created by Apple on 2019/8/26.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <iostream>
#include <stdio.h>
long long F(int num){
if(num == 1)
return 2;
return 3 * F(num - 1) + 2;
}
int main(int argc, const char * argv[]) {
int n;
while(scanf("%d", &n) != EOF){
printf("%lld\n", F(n));
}
return 0;
}