济南联通网站备案,企业网站分析报告,修改网站的备案主体,网络服务提供者无正当理由拒绝提供或者拖延细说蛮力法#xff08;一#xff09;蛮力法百元买百鸡传统暴力枚举减少无用枚举最优解法蛮力法 蛮力法通常在算法题中经常用到#xff0c;也称为暴力枚举#xff0c;其核心为遍历#xff0c;即通过列举所有可能的情况#xff0c;从而得到合适的解。从人的思维角度来看一蛮力法百元买百鸡传统暴力枚举减少无用枚举最优解法蛮力法 蛮力法通常在算法题中经常用到也称为暴力枚举其核心为遍历即通过列举所有可能的情况从而得到合适的解。从人的思维角度来看其实这是一种非常笨的方法。 优点
通俗易懂能后很好的模拟人的思维几乎能够解决所有可计算领域的问题
缺点
需要遍历出现的每一种情况算法时间开销较大适合解决问题规模较小的问题一旦规模较大算法时间性能将大大下降
百元买百鸡 这是一个非常经典的循环问题相信大家在刚学习编程时都会接触到通俗来讲就是 你有100元现有公鸡5元一只母鸡3元一只小鸡1元3只那么你如何分配所买鸡的种类从而使得鸡数为100且100元恰好花光 传统暴力枚举 传统思路我直接枚举每一种方案只要符合我设置的条件 //假设公鸡数x母鸡数y小鸡数z ①xyz100; ②5x3yz/3100 此种情况下我所得到的各鸡的数量一定是符合要求的 void Chicken(
int x,y;z;
int count-0;
for(x0;x100;x)//公鸡{for (y0;y100;y)//母鸡{z100-x-y;//小鸡if((z%30)(5*x3*yz/3100))//设置条件{count;//解的个数count公鸡:x母鸡:y小鸡:zendl;}}}if(!count)cout无解endl;减少无用枚举 再来想那么每种鸡的数量是不是有个最大值呢 公鸡5元我买再多最多买20只 母鸡3元最多33只 小鸡100-公鸡-母鸡 也就是说各鸡数量不可能超过这个最大值若超过一定是不满足条件的可以直接舍去 void Chicken(
int x,y;z;
int count-0;
for(x0;x20;x){for (y0;y33;y){z100-x-y;if((z%30)(5*x3*yz/3100)){count;count公鸡:x母鸡:y小鸡:zendl;}}}if(!count)cout无解endl;最优解法 此处主要运用数学知识来进行简化算法可见数学在算法中的地位 根据关系式 xyz100 5x3yz/3100 可得 ①0x20 ②0y33(必为整数) 所以可推出③47z100; 根据数学知识转化 3②-1*b25-(7/4)a 由于鸡的数量都是大于等于0的整数所以a必须是4得倍数。假如num是一个大于等于0的整数则a可表示为4num;则b可表示为25-7num,c可表示为753*num
我们根据0a20;得到num得范围为0num5; 根据0b33;得到num得范围为0num3; 根据c;得到num得范围为0num8;
所以num的最终范围为0num3;
for(int num0;num3;num){cout公鸡4*num;cout母鸡25-7*num;cout小鸡753*numendl;
}此解法四次遍历即可搞定大大降低了时间复杂度也可以从中看到数学的魅力