渔夫分鱼问题

原题目

甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐则是空的,由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼平分为3份?

思路分析

假设满筐质量为2份,半筐质量为1份,空筐质量为0份。现在已知有三个渔夫,那么每个渔夫需要分到7份鱼。

先遍历甲渔夫分到的满筐数,再遍历乙渔夫分到的满筐数,那么丙分到的满筐数就是7 - 甲的满筐数 - 乙的满筐数。于此同时,需要保证每个人的满筐数最多不超过3个。

接下来进行半筐数的计算,和分满筐一样的道理,从甲渔夫开始遍历。但是我们这个时候需要保证的是每个人分到的鱼的份数得为7。

最后,每个渔夫分到的空筐数 = 7 - 每个渔夫分到的满筐数 - 每个渔夫分到的半筐数。

这样,我们就将每个渔夫分到的鱼筐个数分配完全了。

代码实现

#include<stdio.h>
int main()
{
	int fish[3][3] = { 0 };
	/*行代表渔夫人数
	列代表满筐,半筐和空筐*/
	int i = 0;
	int j = 0;
	int k = 0;
	int l = 0;
	for (i = 0; i <= 3; i++)
	{
		fish[0][0] = i;//第一个渔夫的满筐数
		for (j = 0; j <= 3; j++)
		{
			fish[1][0] = j;//第二个渔夫的满筐数
			fish[2][0] = 7 - i - j;//第三个渔夫的满筐数
			if (fish[2][0] * 2 > 7)
			{
				continue;//不能让第三个渔夫的满筐数超过3
			}
			//进行半筐数计算
			for (k = 0; k <= 5; k++)//第一个渔夫的半筐数
			{
				fish[0][1] = k;
				if (fish[0][0] * 2 + fish[0][1] * 1 == 7)
				{
					break;
				}
			}
			
			for (l = 0; l <= 5; l++)//第二个渔夫的半筐数
			{
				fish[1][1] = l;
				if (fish[1][0] * 2 + fish[1][1] * 1 == 7)
				{
					break;
				}
			}
			fish[2][1] = 7 - k - l;//第三个渔夫的半筐数
		}
	}
	fish[0][2] = 7 - fish[0][0] - fish[0][1];
	fish[1][2] = 7 - fish[1][0] - fish[1][1];
	fish[2][2] = 7 - fish[2][0] - fish[2][1];
	//此时余筐已经分完了

	for (int m = 0; m < 3; m++)
	{
		for (int n = 0; n < 3; n++)
		{
			printf("%d ", fish[m][n]);
		}
		printf("\n");
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值