问题描述:等分液体,在一个瓶子中装有8(N偶数)升汽油,要平均分成两份,但只有一个装3(N / 2 - 1)升的量杯和装5(N / 2 + 1)升的量杯(都没有刻度)。打印出所有把汽油分成两等分的操作过程。若无解打印“NO”,否则打印操作过程。
解法:无论面对什么困难,微笑的面对他,战胜困难的最好办法就是数学最优解。奥利奥!!----著名诗人,鲁迅曾经说过。
当然我们没有例子是没有办法快速理解的。比如说葛优大爷有八根头发。你只有两个手指头,大拇指一次可以摸5根,小拇指一次可以摸三根。怎么摸出来四根呢?你大拇指黏五根,小拇指一撮,剩两根。你拿了出来。再来一次,正好四根,满足要求!!!.所以我们就将2*N偶数跟头发转化成了存在多少个2, 3, 5的问题。以下是代码实现:
#include <iostream>
using namespace std;
void middle(int n) {
int t = 0;
for(int i = 0; i <= n / 4; i ++) {
for(int j = 0; j <= n / 6; j ++) {
for(int k = 0; k <= n / 10; k ++) {
if(2 * i + 3 * j + 5 * k == n / 2) {//find n / 2 consider:i:2 j:3 k:5
if(i && !j && !k) {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒5升油进5升的量筒,然后再把容量为5升量筒的油倒3升油到容量为3升的量筒最后再将其剩下油倒进相关容器的过程执行" << i << "次\n";
}
else if(!i && j && !k) {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒3升油进容量3升的量筒然后再将其倒进相关容器的过程执行" << j << "次\n";
}
else if(!i && !j && k) {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒5升油进容量5升的量筒然后再将其倒进相关容器的过程执行" << k << "次\n";
}
else if(i && j && !k) {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒5升油进5升的量筒,然后再把容量为5升量筒的油倒3升油到容量为3升的量筒最后再将其剩下油倒进相关容器的过程执行" << i << "次\n";
cout << "步骤二:将从原来装有" << n << "升油的瓶子倒3升油进容量3升的量筒然后再将其倒进相关容器的过程执行" << j << "次\n";
}
else if(i && !j && k) {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒5升油进5升的量筒,然后再把容量为5升量筒的油倒3升油到容量为3升的量筒最后再将其剩下油倒进相关容器的过程执行" << i << "次\n";
cout << "步骤二:将从原来装有" << n << "升油的瓶子倒5升油进容量5升的量筒然后再将其倒进相关容器的过程执行" << k << "次\n";
}
else if(!i && j && k) {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒3升油进容量3升的量筒然后再将其倒进相关容器的过程执行" << j << "次\n";
cout << "步骤二:将从原来装有" << n << "升油的瓶子倒5升油进容量5升的量筒然后再将其倒进相关容器的过程执行" << k << "次\n";
}
else {
t ++;
cout << "方案" << t << ": \n";
cout << "步骤一:将从原来装有" << n << "升油的瓶子倒5升油进5升的量筒,然后再把容量为5升量筒的油倒3升油到容量为3升的量筒最后再将其剩下油倒进相关容器的过程执行" << i << "次\n";
cout << "步骤二:将从原来装有" << n << "升油的瓶子倒3升油进容量3升的量筒然后再将其倒进相关容器的过程执行" << j << "次\n";
cout << "步骤三:将从原来装有" << n << "升油的瓶子倒5升油进容量5升的量筒然后再将其倒进相关容器的过程执行" << k << "次\n";
}
}
}
}
}
if(!t) {
cout << "No way!" << endl;
return ;
}
cout << "共有" << t << "种解决方法" << endl;
}
int main() {
int n;
cin >> n;
while(n % 2) {
cout << "Error, next one! :";
cin >> n;
}
middle(n);
}