问题
百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只
第一种方法
三层循环(穷举法)
#include <iostream>
using namespace std;
int main()
{
int x,y,z; //分别是小鸡、公鸡、母鸡
for(x=3; x<100 ;){
for(y=0;y<34;y++){
for(z=0;z<20;z++){
if( ( (x/3) + 3*y + 5*z)== 100 && (x+y+z)==100){
cout<<"母鸡:"<<z;
cout<<"公鸡:"<<y;
cout<<"小鸡:"<<x<<endl;
}
}
}
x = x+3;
}
}
用暴力破解
需要满足的方程 : x/3+3y+5z =100 、 x + y +z =100
其中100、34、20 均是计算得到的,用来进行范围缩小
结果如下
第二种方法
二层循环
#include <iostream>
using namespace std;
int main()
{
int x,y,z; //分别是小鸡数的三分之一、公鸡、母鸡
for (x=0; x<33 ; x++) {
for (y=0;y<33;y++) {
z = 100 -y - 3*x ;
if ( (x + 3*y + 5*z ) == 100 && z > -1 ) {
cout<<"母鸡:"<<z;
cout<<"公鸡:"<<y;
cout<<"小鸡:"<<3*x<<endl;
}
}
}
}
需要满足的的方程 x + 3y + 5z = 100 、 3x + y + z = 100
x这里代表的是小鸡数量的三分之一
先穷举x,y, 然后通过方程 3x + y + z = 100 得到 z(z可能为负数)
最后只要满足 另外的一个方程 和 z大于零
结果
第三种方法
#include <iostream>
using namespace std;
int main()
{
int x,y,z;
for (x=0; x<33 ; x++) {
z = 4*x -100;
y = 200 -7*x;
if (z > -1 && y > -1) {
cout<<"母鸡:"<<z;
cout<<"公鸡:"<<y;
cout<<"小鸡:"<<3*x<<endl;
}
}
}
首先 通过解方程 x + 3y + 5z = 100 、 3x + y + z = 100
得到y、z关于x的方程。(x这里代表的是小鸡数量的三分之一)
即 y = 200 - 7x 、z = 4*x - 100 (y,z都可能为负数)
通过 穷举x 和 解出的方程 得到 y、z的值
这里演示的是 穷举x来计算y、z。你也可以穷举y和z,只需要计算相应的方程即可。
结果
主要是通过方程,减少穷举和循环的次数。