泊松分酒(15)

题目内容:

有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;
}


猜你喜欢

转载自blog.csdn.net/qq_37430374/article/details/79110150