平分七筐鱼:21个箩筐,七筐装满,七筐半筐,七个空筐

随船带了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 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值