黑马程序员技术交流社区

标题: 一道算法问题,买狗的问题,求解! [打印本页]

作者: ponyworld    时间: 2012-2-1 15:34
标题: 一道算法问题,买狗的问题,求解!
有一个人每个月的工资为300元;邻居家有一条狗,
他想用赚到的钱把邻居家所有的狗都买过来,一条狗1000元,
但3个月一只狗就能生出1只小狗。问这个人能否实现愿望?

作者: 黑马易伟    时间: 2012-2-1 15:52
这个和Java有关系么?不要灌水啊!
作者: 张伟~    时间: 2012-2-1 16:10
是每3个月一只狗能生一只狗,还是说狗3个月长大后生一只,然后以后每一个月生一只?
作者: 刘基军    时间: 2012-2-1 16:14
买不到:3个月,人才增加900元,狗增加>1只
作者: 毛溯澜    时间: 2012-2-1 16:22
所有狗?
买不到的:理由同上。
公狗除外{:soso_e122:}

作者: ponyworld    时间: 2012-2-1 16:37
飞飞不落up 发表于 2012-2-1 15:52
这个和Java有关系么?不要灌水啊!

算法问题,怎么没关系呢?编程题啊
作者: ponyworld    时间: 2012-2-1 16:38
张伟~ 发表于 2012-2-1 16:10
是每3个月一只狗能生一只狗,还是说狗3个月长大后生一只,然后以后每一个月生一只? ...

每只狗每3个月会生一只狗
作者: 黑马易伟    时间: 2012-2-1 17:12
攒四个月钱把邻居家的大狗也就是生仔的母狗买下来,以后母狗生的小狗都是你自己的啦。这样的邻居家还有一只小狗,你再攒三个月就可以把那只小狗也买了,这样你就把邻居家所有的狗都买到了。
作者: 荣凯旋    时间: 2012-2-1 18:06
你提的问题不全面~你这个和老师的出的基础测试题,兔子的问题有些类似~但你没有任何的限制条件~那这样的可能性就比较多啦~程序也就比较多啦~

作者: 黄秋    时间: 2012-2-2 01:57
如果每3个月一只狗就能生出1只小狗,不考虑公母,大小,不可以把所有的狗都买过来。设刚开始是1月,第4月有1200元,能买一只狗,但这时足够3个月,已生出1小狗,这样第4月时:邻居仍有一狗,而那人剩下200元。依此类推,第7月时:邻居仍有一狗,而那人剩下100元;第10月时:邻居仍有一狗,而那人剩下0元。

据此,可用程序模拟:
  1. public class Test{
  2.         public static void main(String[] args)
  3.         {
  4.                 int money=0,salary=300,n=1,x=1000;
  5.                 for(int i=1;i<=x;i++){
  6.                         money+=salary;
  7.                         if(i>1 && (i-1)%3==0)        n++;
  8.                         if(money>=1000){
  9.                                 n--;
  10.                                 money-=1000;
  11.                         }
  12.                         if(n==0){
  13.                                 System.out.println(i+" 月可以把所有的狗都买过来");
  14.                                 return;
  15.                         }
  16.                         if(money<=0){
  17.                                 System.out.println(i+" 月了,还不可以把所有的狗都买过来");
  18.                                 return;
  19.                         }                       
  20.                 }
  21.                 System.out.println(x+" 月还不能把所有的狗都买过来");
  22.         }
  23. }
复制代码
那人3个月才有900元,邻居3个月产出一小狗:1000元,可看作邻居的产值高,他追不上。
作者: 戴振良    时间: 2012-2-2 08:22
本帖最后由 戴振良 于 2012-2-2 08:24 编辑

这问题就不用去想编程先,首先你得按实际去思考一下,每3个月就生一只狗,我假设第一只狗称之为母狗,我假设它不会停产的,而且我不会卖,只用来生小狗,我再假设它生出来的都是公狗,我再假设要买公狗就只要900块钱。
有了这些假设之后,我们来说3个月后:你赚了900块,而母狗生了一只公狗,你正好够钱把这只公狗给买了,再过3个月你又有900块,而母狗又生了一只公狗……就这样,你只有钱买公狗,什么时候能赚够钱把那只母狗给买了呢?这是不可能的!除非母狗死了生不了小狗的时候你可以用900块买个死母狗,不过你还是买不到母狗,因为我上面假设了母狗我不卖,无价之宝!!这下明白了吧,这就是编程思想吧应该!!
作者: ponyworld    时间: 2012-2-3 10:05
飞飞不落up 发表于 2012-2-1 17:12
攒四个月钱把邻居家的大狗也就是生仔的母狗买下来,以后母狗生的小狗都是你自己的啦。这样的邻居家还有一只 ...

是这样思想,但是代码实现一下,三个月后又生一只狗了
作者: 彭沛东    时间: 2012-2-5 16:58
  1. /**
  2. * 需求 :有一个人每个月的工资为300元;邻居家有一条狗,他想用赚到的钱把邻居家所有的狗都买过来,一条狗1000元,但3个月一只狗就能生出1只小狗
  3. * 思路:1.编程思想:这个人每月只有300工资、需要4个月才有足够的钱买一只狗、而狗每三个月就产一只,
  4. *         得之,这个人在怎么努力、狗的产量始终比他工资要高、所以他永远也买不完。
  5. *                 2.生活思想:这个人可以在第四个月直接把母狗买了、母狗生下的可能是母狗或者公狗、反正只买母狗、当没了母狗那公狗也就没 生育的可能了、那也可能买完所有的狗。
  6. * 步骤:1.分别定义这个人工资、当前资金、狗的数目。
  7. *                 2.算人的寿命成0岁开始、一年12个月、12*100岁、所以他有1200月去买那些狗,也就是循环1200次
  8. *                 3.每循环一次、算作一个月、这个人工资加一次。当每循环3次、狗的只数加一只.判断:当当前资金大于或等于1000的时候、当前资金减1000,狗的个数减一
  9. *                 4.当狗的个数为0时代表买完了。否则没买完 5.运算结果、此人至少在有生之年是没法买完所有的狗
  10. */
  11. public class Test {

  12.         public static void main(String[] args)
  13.         {
  14.                 int money = 0; // 资金
  15.                 int wage = 300; // 工资
  16.                 int dogNum = 1; // 狗只数
  17.                 for (int i = 0; i <= 1200; i++)
  18.                 {
  19.                         // 每个月工资加一次
  20.                         money += wage;      
  21.                         if (i > 0 && i % 3 != 0)
  22.                         {
  23.                                 // 每循环三次 狗的个数加一
  24.                                 dogNum++;                  
  25.                         }
  26.                         if (money >= 1000)
  27.                         {
  28.                                 dogNum--;
  29.                                 money -= 1000;
  30.                         }
  31.                         if (dogNum == 0)
  32.                         {
  33.                                 System.out.println("在第" + i + "月全买了");
  34.                                 break;
  35.                         }
  36.                         else
  37.                         {
  38.                                 System.out.println(i + " 月了,资金=" + money + "-->狗个数=" + dogNum);
  39.                         }
  40.                 }
  41.         }
  42. }
复制代码

作者: 成果    时间: 2012-2-5 22:44
如果每3个月一只狗就能生出1只小狗,不考虑公母,不可能把所有的狗都买过来。前4个月有1200元,能买一只狗A,但这时已生出1小狗b1,你花1000元买来一只,但邻居家还有一只,此时你还有200元。此时你要再过三个月才有200+900=1100元。而邻居家的小狗b1过二个月就产下了小狗c1,并且小狗c1已有一个月大。此时你买下小狗b1后只有100元。依此你我3*300=900元。买不完邻居家的狗狗。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2