随船带了21只箩筐,当返航时,发现有7筐装满了鱼、7筐装了半筐鱼、7筐是空的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为三分?
根据题意可以得到:每个人应该分到7个箩筐,共有3.5筐鱼。采用一个3*3的数组a来表示三个人分到的东西。其中每个人对应数组a的一行,数组的第0列放分到的鱼的整筐数,数组的第1列放分到的半筐数,数组的第2列放分到的空筐数。由题目可以推出:
1.数组的每行或每列的元素之和都为7;
2.对数组的行来说,满筐数加半筐数=3.5;
3.每个人所得的满筐数不能超过3筐;
4.每个人都必须至少有1 个半筐,且半筐数一定为奇数
对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的,为了避免出现重复的分配方案,可以规定:第二个人的满筐数等于第一个人的满筐数;第二个人的半筐数大于等于第一个人的半筐数。
1 //平分七筐鱼
2
3 #include <stdio.h>
4
5 int a[3][3], count;
6 int main()
7 {
8 int i, j, k, m, n, flag;
9
10 printf("It exists possible distribution plans:\n");
11
12 for (i = 0; i <= 3; i++)
13 {
14 a[0][0] = i;
15 for(j = i; j <= 7 - i && j <= 3; j++)
16 {
17 a[1][0] = j;
18 if((a[2][0] = 7 - j - a[0][0]) > 3)
19 {
20 continue;
21 }
22 if(a[2][0] < a[1][0])
23 {
24 break;
25 }
26 for (k = 1; k <= 5; k+= 2 )
27 {
28 a[0][1] = k;
29 for (m = 1; m < 7-k; m+=2)
30 {
31 a[1][1] = m;
32 a[2][1] = 7 - k - m;
33 for(flag = 1, n = 0; flag && n< 3; n++)
34 {
35 if(a[n][0] + a[n][1] < 7 && a[n][0] * 2 + a[n][1] == 7)
36 {
37 a[n][2] = 7 - a[n][0] - a[n][1];
38 }
39 else
40 {
41 flag = 0;
42 }
43 }
44 if(flag)
45 {
46 printf("No.%d FULL basket Semi-basket Empty\n",++count);
47 for (n = 0; n < 3; n++)
48 {
49 printf(" fisher%c: %d %d %d\n",'A'+n, a[n][0], a[n][1], a[n][2]);
50 }
51 }
52 }
53 }
54 }
55 }
56 return 0;
57 }
58