题目:有300匹马,驮300担货,大马驮4担,中马驮3担,两匹小马驮1担,问大中小马各多少匹,有多少组解。(要求大马、小马、中马的数量各不少于5匹,每匹马都得用上)。
无脑法:
for(d;d<=289;d++){
for(z=5;z<=300-d;z++){
for(x=6;x<=300-z-d;x++){
if(x%2==0){
if(d*4+z*3+(x/2)==300 &&d+z+x==300){
cout<<d<<" "<<z<<" "<<x<<endl;
}
}
}
}
}
现在重写一下:
由题意得,
大中小三种马数量和为300,驮300担
每种马至少5匹
因为x的上限最小,计算次数最少,所以把y,z写成x的函数
由方程组知x是5的倍数,且有
所以
所以该题有7个解,一行代码解决
for (int x = 5, y = 5, z = 6; x <= 35; x += 5){cout<<x<<" "<<60-(7*x)/5<<" "<<240+(2*x)/5<<endl;}
结果:
5 53 242
10 46 244
15 39 246
20 32 248
25 25 250
30 18 252
35 11 254