渔夫分鱼问题
甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐则是空的,由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为3份?
由题可知,框每个各7个,鱼每人各3.5个,设a为满框个数,b为半框个数,a = (1/2)b,答案不唯一:
\ | 整框数 | 半框数 | 空框数 |
---|---|---|---|
甲 | 3 | 1 | 3 |
乙 | 3 | 1 | 3 |
丙 | 1 | 5 | 1 |
由以上个例可知:
1.同行和同列的和为7
2.a + (1/2)b = 3.5
3.整框个数最大不超过3
解题思路如下:
1.设置一个二维的33数组
2.使用穷举法,把所有可能都找出来,但必须满足上面的要求
代码如下:
void mycode_8()
{
int kuang[3][3];
for (int i = 1; i <= 3; i++)
{
kuang[0][0] = i; //甲满框的个数
for (int j = 1; j <= 3; j++)
{
kuang[1][0] = j; //乙满框的个数
for (int k = 1; k <= 3 && k <= 7 - (i + j); k++) //列总和不超过7
{
kuang[2][0] = k; //丙满框的个数
for (int o = 0; o <= 7; o++)
{
kuang[0][1] = o; //甲半框的个数
for (int p = 0; p <= 7 - o; p++)
{
kuang[1][1] = p; //乙半框的个数
for (int l = 0; l <= 7 - (p + o); l++)
{
kuang[2][1] = l; //丙半框的个数
if (kuang[0][0] + kuang[1][0] + kuang[2][0] == 7 && kuang[0][1] + kuang[1][1] + kuang[2][1] == 7)
{
if (double(kuang[0][0]) + double(kuang[0][1]) / 2 == 3.5&&double(kuang[1][0]) + double(kuang[1][1]) / 2 == 3.5&&double(kuang[2][0]) + double(kuang[2][1]) / 2 == 3.5)
{
kuang[0][2] = 7 - kuang[0][0] - kuang[0][1];
kuang[1][2] = 7 - kuang[1][0] - kuang[1][1];
kuang[2][2] = 7 - kuang[2][0] - kuang[2][1];
//打印符合项
for (int n = 0; n < 3; n++)
{
for (int m = 0; m < 3; m++)
printf("%2d ", kuang[n][m]);
putchar('\n');
}
putchar('\n');
putchar('\n');
}
}
}
}
}
}
}
}
}
得到答案: