一、问题概述
有一百匹马,一百担货,大马驮三担,中马驮二担,两匹小马驮一担,问大中小马各多少匹?
二、解法(Java编程)
解法一:用常规的方法
for( big = 0;big <= 34;big++)
      for( mid = 0;mid <= 50;mid++)
           for( small = 0;small < 100;small++)
                if((big * 3 + mid * 2 + small / 2 == 100)&&(big + mid + small == 100))
                     System.out.println(big + " " + mid + " " + small);
运行结果为:14种
1 32 67
2 30 68
4 27 69
5 25 70
7 22 71
8 20 72
10 17 73
11 15 74
13 12 75
14 10 76
16 7 77
17 5 78
19 2 79
20 0 80
解法二:用数学知识对其进行进一步的优化
3*big+ 2*mid+(100-big-mid)/2 = 100 化简(等号两边同乘2)可以得到 5*big+3*mid =100
其图像是:那么程序就是:
  for (x=0;x<=20;x++)
        {
            for(y=0;y<=34;y++)
                if((5*x+3*y)== 100) 
                 System.out.printf("%d,%d,%d\n",x,y,100-x-y);
        }
输出结果:
2,30,68
5,25,70
8,20,72
11,15,74
14,10,76
17,5,78
20,0,80
三、疑惑
很明显解法二比解法一的结果少,一共少了7种:就是小马为奇数个的情况。
但是仔细分析一下,小马为奇数不是不可以,只要让一个小马不驮货物,实际情况也是允许的。所以第一种情况没错。第二种方法也是没问题的啊,那么问题来了,就一个问题,不同的方法按理说因该有相同的答案的,但这里却出现了两种方法两种答案
而且我百度到的也是各不相同,有14中的,有7中的。
所以,我就有点混乱了。
我感觉现在我就是那个最厉害矛,最厉害的盾,完全矛盾,死循环了。
欢迎大神指点迷津

解决方案 »

  1.   

    不足为奇啊,第二种解法5x+3y=100限制了x,y只能同为奇数,或者同为偶数,所以100-x-y必定是偶数
    第一种解法big和mid没有这个限制,如果你把big和mid也加上同样的限制,结果肯定是一样
      

  2.   

    上面的评论真的搞笑,第一种方法根本不对,14种也不对。比如 第一条,1*3+32*2+76/2=??? ,造成这个的原因是因为 small的类型是整型,整型被除后得到的结果,如果不自己定义类型,会自动默认为还是整型,67除以2 得到的不是33.5 而是33!!!!
    一瓶子不满半瓶子咣当,好好打牢基础吧
      

  3.   


    因为你在解法二内强制小马为偶数3*big+ 2*mid+(100-big-mid)/2 = 100 添加了条件,如果照你的理解小马可以为奇数的话,99匹马也能达成100担的要求,1匹小马没有担东西。3*big+ 2*mid+(99-big-mid)/2 = 100 但是明显和题意不符合,所以只有解法二是正确的,不然干么要100匹马呢,99也可以。