百马百担问题的探讨及疑惑

DUZ子非鱼 2019-03-27 08:02:53
一、问题概述
有一百匹马,一百担货,大马驮三担,中马驮二担,两匹小马驮一担,问大中小马各多少匹?
二、解法(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中的。
所以,我就有点混乱了。
我感觉现在我就是那个最厉害矛,最厉害的盾,完全矛盾,死循环了。
欢迎大神指点迷津
...全文
992 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序乄小四 2019-04-19
  • 打赏
  • 举报
回复
第一种肯定是错的,如果可以有马不驼 ,100大马可以吗???99大马1小马可以吗???? 怎么说第一种都是错的
qybao 2019-04-18
  • 打赏
  • 举报
回复
这个问题纠缠这么久
个人觉得就是题目不严谨,把问题改成补充一下就知道了,可以说题目的理解模凌两可,所以毫无意义
如果你像神剧里的主角一样聪颖过人,你就跟问出题者掰活一下各种情况

//求一种解
问大中小马各多少匹(恰好驼完)? //求其中一种解即可(马必须都用上)
问大中小马各多少匹(可以驼完)?//求其中一种解即可(马可以不用上)

//求所有解
问大中小马各多少匹(恰好驼完的方法有几种)?//求所有解
问大中小马各多少匹(可以驼完的方法有几种)?//求所有解

//求最优解
问大中小马各多少匹(恰好驼完并且成本最低)?//求最优解(假设每匹马的成本不一样)
问大中小马各多少匹(可以驼完并且成本最低)?//求最优解(假设每匹马的成本不一样),理论上最优解应该是一致的
greadworld 2019-04-18
  • 打赏
  • 举报
回复
楼主的疑惑只是因为第一种的代码写错了而已,整数的除法会舍去小数部分,从而导致了所为的结果误差,题目明显是百马均负担,否则空1马可以,为何不能空更多呢?
qq_39936465 2019-04-17
  • 打赏
  • 举报
回复
引用 楼主 天自天我 的回复:
三、疑惑 很明显解法二比解法一的结果少,一共少了7种:就是小马为奇数个的情况。 但是仔细分析一下,小马为奇数不是不可以,只要让一个小马不驮货物,实际情况也是允许的。所以第一种情况没错。第二种方法也是没问题的啊,那么问题来了,就一个问题,不同的方法按理说因该有相同的答案的,但这里却出现了两种方法两种答案 而且我百度到的也是各不相同,有14中的,有7中的。 所以,我就有点混乱了。 我感觉现在我就是那个最厉害矛,最厉害的盾,完全矛盾,死循环了。 欢迎大神指点迷津
因为你在解法二内强制小马为偶数 3*big+ 2*mid+(100-big-mid)/2 = 100 添加了条件,如果照你的理解小马可以为奇数的话,99匹马也能达成100担的要求,1匹小马没有担东西。 3*big+ 2*mid+(99-big-mid)/2 = 100 但是明显和题意不符合,所以只有解法二是正确的,不然干么要100匹马呢,99也可以。
苏洛洛Ar 2019-04-13
  • 打赏
  • 举报
回复
小马不可能为奇数吧
小小菜鸟肥 2019-04-12
  • 打赏
  • 举报
回复 1
如果可以出现有马不用这种情况的话,这题目完全没有意义的。比如,大马33匹,小马2匹,这样刚刚100担。那么剩下的65匹,我是不是随便整?这只是其中一种情况,还有很多。
Hunter__Wong 2019-04-11
  • 打赏
  • 举报
回复
上面的评论真的搞笑,第一种方法根本不对,14种也不对。比如 第一条,1*3+32*2+76/2=??? ,造成这个的原因是因为 small的类型是整型,整型被除后得到的结果,如果不自己定义类型,会自动默认为还是整型,67除以2 得到的不是33.5 而是33!!!! 一瓶子不满半瓶子咣当,好好打牢基础吧
DUZ子非鱼 2019-04-11
  • 打赏
  • 举报
回复
引用 5 楼 Hunter__Wong的回复:
上面的评论真的搞笑,第一种方法根本不对,14种也不对。比如 第一条,1*3+32*2+76/2=??? ,造成这个的原因是因为 small的类型是整型,整型被除后得到的结果,如果不自己定义类型,会自动默认为还是整型,67除以2 得到的不是33.5 而是33!!!! 一瓶子不满半瓶子咣当,好好打牢基础吧
您的意思我不太明白,就论大1中32小67的情况,为什么不可以?1ж3+32ж2+66/2=100 (67匹小马,拿出一匹不用,符合实际情况,只不过是资源浪费了)您说的整型相除就是这样理解的
DUZ子非鱼 2019-04-11
  • 打赏
  • 举报
回复
引用 5 楼 Hunter__Wong的回复:
上面的评论真的搞笑,第一种方法根本不对,14种也不对。比如 第一条,1*3+32*2+76/2=??? ,造成这个的原因是因为 small的类型是整型,整型被除后得到的结果,如果不自己定义类型,会自动默认为还是整型,67除以2 得到的不是33.5 而是33!!!! 一瓶子不满半瓶子咣当,好好打牢基础吧
您的意思我不太明白,就论大1中32小67的情况,为什么不可以?1ж3+32ж2+66/2=100 (67匹小马,拿出一匹不用,符合实际情况,只不过是资源浪费了)您说的整型相除就是这样理解的
DUZ子非鱼 2019-03-28
  • 打赏
  • 举报
回复
引用 1 楼 qybao的回复:
不足为奇啊,第二种解法5x+3y=100限制了x,y只能同为奇数,或者同为偶数,所以100-x-y必定是偶数 第一种解法big和mid没有这个限制,如果你把big和mid也加上同样的限制,结果肯定是一样
那第一种解法14种解也是对的?
qybao 2019-03-28
  • 打赏
  • 举报
回复
那就看题目要求了,如果题目要求马恰好用完,那就不对,没这个要求,那就算对。只能说你这个题目出的不严谨。
阳小咩先生 2019-03-27
  • 打赏
  • 举报
回复
如果把第一种解法添加上第二种解法的限制就一样的答案了
qybao 2019-03-27
  • 打赏
  • 举报
回复
不足为奇啊,第二种解法5x+3y=100限制了x,y只能同为奇数,或者同为偶数,所以100-x-y必定是偶数 第一种解法big和mid没有这个限制,如果你把big和mid也加上同样的限制,结果肯定是一样

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧