C语言实验题——最节省材料

C语言实验题——最节省材料

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:354            测试通过:74

描述

一个长度为L米的材料,需要截成长度为a米和b米的短材料,求两种短材料各截多少根时,剩余的材料最少。

输入

数据有多行,每行三个整数,分别是L,a,b;

输出

每行输出截出a长度和截出b长度材料的根数,结果有多个时,只输出总根数最少或最长材料根数最少的数据。

样例输入

10 2 3

样例输出

2 2

#include

int main(void){

	int length;									//材料总长度
	int a_length, b_length;						//a材料和b材料的长度
	int a_counter, b_counter;					//a材料和b材料的计数器
	int a_max, b_max;							//最多可以截取的a材料和b材料数量
	int a_result, b_result;						//目前的最优方案a,b材料的根数
	int length_result;							//目前的最优方案余下的材料长度
	int remainder;								//当前方案余下的材料长度

	while (scanf("%d%d%d", &length, &a_length, &b_length) != EOF){

		a_result = INT_MAX;						//初始为最大值,以便能被第一个方案取代
		b_result = INT_MAX;
		length_result = INT_MAX;
		a_max = length / a_length;
		b_max = length / b_length;

		for (a_counter = 0; a_counter <= a_max; ++a_counter){
			for (b_counter = 0; b_counter <= b_max; ++b_counter){
				remainder = length - (a_length*a_counter + b_length*b_counter);
				if (remainder >= 0){
					if (remainder < length_result){
						length_result = remainder;
						a_result = a_counter;
						b_result = b_counter;
					}
					else if (remainder == length_result){				//结果有多个时,只输出总根数最少或最长材料根数最少的数据
						if (a_counter + b_counter < a_result + b_result){			//判断总根数是否更少
							length_result = remainder;
							a_result = a_counter;
							b_result = b_counter;
						}
						else if (a_counter + b_counter == a_result + b_result){
							if ((a_length >= b_length && a_result > a_counter)
								|| (a_length < b_length && b_result > b_counter)){	//总根数相等时,判断最长材料根数是否更少
								length_result = remainder;
								a_result = a_counter;
								b_result = b_counter;
							}
						}
					}
				}
			}
		}

		printf("%d %d\n", a_result, b_result);

	}
	return 0;
}


你可能感兴趣的:(C++数学问题)