1, 枚举:
顾名思义,就是暴力(对于我来说),毕竟暴力出奇迹嘛。下面来看一道题(水题,想必大家都会)
给定一个式子,求出ABC。ABC满足以下条件:
AB*A=CCC
这一道题显然很简单。我们先用数学方法来做一遍(是很有必要的)
基础分析
C=111*c,而111=3*37。
所以CCC=C*3*37。
AB一定是37和74中的一个(而且满足要74,C还一定是2的被数),因为37不可能是右边分解质因数的结果(明显是一个一位数),所以37只能是AB分解质因数的结果,而AB又是两位数,所以其结果一定是这两个数。
而A一定是3的倍数,因为CCC分解质因数有3,而AB不可能有3.
冷静分析
从AB可以得知,A只有是3或7.而A又是3的倍数,所以A是3,b就只能是7.
在算一下就是3*37=111.
算数思想是不是太麻烦了,直接打下来不就好了
代码如下
#include<bits/stdc++.h>
Using namespace std;
Int main()
{
For(int a=1;a<=9;a++)
For(int b=1;b<=9;b++)
For(int c=1;c<=9;c++)
If(a*((a*10)+b)==c*111)cout<<a<<b<<c;
Return 0;
}
是不是很草率。
就这么简单。
下面在来模拟几道题,来做一下
1,A*B=CD
2,AA*BB=CCDD
(代码我就不发了,想必大家都会)
这就是枚举
我们来看一道题
这道简化很多才打出来的
课程分数=xa\%+yb\%+z*(100-a-b)\%,已知想x,a,y,b。要让课程分高于60,z至少要多少?如果无答案,就输出“poor little A!”;
很多人会问,这是枚举?
对,这就是枚举。
可是这明明是用数学方法做的呀。
我们来用数学方法来试一试
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;double x,y,a,b,o;
for(int i=1;i<=t;i++)
{ cin>>x>>y>>a>>b;
o=60-x*a/100-y*b/100+z*(100-a-b)/100;
if(o>=0&&o<=100)cout<<o;
else cout<<”poor little A!”;
return 0;}
你们想说就是这样对吧;
我要说一句,
浮点型是很难懂的,
在我以后发的《有趣的浮点型》里就会提到
那怎们办,有一种很好的方法。
看一下我的程序就知道了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;int x,y,a,b,o;
for(int i=1;i<=t;i++)
{ cin>>x>>y>>a>>b;
o=6000-x*a-y*b+z*(100-a-b);
if(o/100>=0&&o/100<=100)cout<<o;
else cout<<”poor little A!”;
return 0;}
是不是一个绝妙的方法?
可是你们会问,
这还是没有用到枚举呀,
还会出现一个问题:a,b有没有可能是0。
想到没有?
所以还是用上枚举吧
标程:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;double x,y,a,b,o;
for(int i=1;i<=t;i++)
{
cin>>x>>y>>a>>b;
for( o=0;o<=101;o++)
if(x*a+y*b+o*(100-a-b)>=6000)break;
if(o<=100&&o>=0)cout<<int(o)<<endl;
else cout<<"poor little A!"<<endl;}
return 0;}
2,DFS
dfs,其实就是一种递推(对于我来说),
概念:举一个栗子
我从教室到厕所(快憋不住了!!!十万火急!!!),我会先找准一个方向走到尽头,发现不是,就退回来(1步),在找一个方向......当所有的方向都找完的时候(已经退回1步的时候),就再退回一步,继续走。
其实DFS没什么好讲的
基本框架:
1. void dfs(int deep, State curState)
2. {
3. if (deep > Max) //深度达到极限
4. {
5. if (curState == target) //找到目标
6. {
7. //...
8. }
9. }
10. else
11. {
12. for (i = 1; i <= totalExpandMethod; i++)
13. {
14. dfs(deep + 1,
15. expandMethod(curState, i));
16. }
17. }
18. }
是不是有点简单了
这就是DFS和枚举
谢谢