原题目
甲、乙、丙三位渔夫出海打鱼,他们随船带了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;
}