枚举法思想:把所有可能的答案一一列举,然后根据判断条件,合适就保留,不合适就丢弃。
算法思路:
1、确定问题解得范围
2、判断解是否符合判断条件
3、降低解的范围,重新判断
实例:百钱买百鸡
公鸡每只5元,母鸡每只3元,小鸡一元三只。用一百元钱买一百只鸡,求所有可能!?
for(int x = 0 ; x <= 100 ; x++){
for(int y = 0 ; y <= 100 && x + y <= 100 ; y++){
if((100 - x - y ) % 3 == 0 &&(5 * x + 3 * y + (100 - x - y) / 3) == 100){
cout<<"公鸡:"<<setw(3)<<x<<" 母鸡:"<<setw(3)<<y<<" 小鸡:"<<setw(3)<<100 - x - y<<endl;
}
}
}
实例:填写运算符
在下面算式中添加“+”,“-”,“*”,“/”,使等式成立。
5 5 5 5 5 = 5
char opption[4] = {'+','-','*','/'};
int no[5] = {5,5,5,5,5};
int opp[4] = {0};
int sign = 1;
int count = 0;
for (opp[0] = 0; opp[0] < 4; opp[0]++) {
for (opp[1] = 0; opp[1] < 4; opp[1]++) {
for (opp[2] = 0; opp[2] < 4; opp[2]++) {
for (opp[3] = 0; opp[3] < 4; opp[3]++) {
int left = 0;
int right = no[0];
for (int i = 0; i < 4; i++) {
switch (opption[opp[i]]) {
case '+':
left += sign * right;
sign = 1;
right = no[i + 1];
break;
case '-':
left += sign * right;
sign = -1;
right = no[i + 1];
break;
case '*':
right *= no[i + 1];
break;
case '/':
right /= no[i + 1];
break;
default:
break;
}
}
if(left + sign * right == 5){
count++;
cout<<setw(3)<<count<<":5"<<opption[opp[0]]<<"5"<<opption[opp[1]]<<"5"<<opption[opp[2]]<<"5"<<opption[opp[3]]<<"5=5"<<endl;
}
}
}
}
}