题目内容:
有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。下面的列表是可能的操作状态记录:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每行3个数据,分别表示12,8,6升容器中的油量
第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,...
当然,同一个题目可能有多种不同的正确操作步骤。 本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的状态,和要求的目标油量,程序则通过计算输出是否可能分成功-“Y”,“N”。
例如,用户输入:
12,8,5,12,0,0,6
用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以) 则程序可以输出“Y”
输入描述:
各个容器的容量,开始的状态,和要求的目标油量
输出描述:
是否可能分成功-“Y”,“N”
输入样例:
12,8,5,12,0,0,6
输出样例:
Y
利用数学规律解题:
https://www.cnblogs.com/heaad/archive/2010/11/22/1884658.html
利用穷举判断是否存在 |b*i-c*j| == last 即可
AC代码:
#include <iostream> #include <cmath> #include <cstdio> using namespace std; int last; int max(int x, int y){ return x < y ? y : x; } bool right(int an, int bn, int cn){ if(an == last || bn == last || cn == last) return true; else return false; } bool divide(int a, int b, int c, int m){ for(int i = 1; i < m; i++) for(int j = 0; j < m; j++) if(abs(b*i - c*j) == last) return true; return false; } int main(){ int a, b, c; int an, bn, cn; scanf("%d,%d,%d,%d,%d,%d,%d", &a, &b, &c, &an, &bn, &cn, &last); int M = max(an, max(bn, cn)); if(right(an, bn, cn)) cout << "Y" << endl; else { int ans = divide(a, b, c, M); if(ans) cout << "Y" << endl; else cout << "N" << endl; } return 0; }