+ -
当前位置:首页 → 问答吧 → 这种问题应该如何解!

这种问题应该如何解!

时间:2013-05-18

来源:互联网

本帖最后由 iove6600 于 2013-5-18 14:51 编辑

三个瓶盖可以换一瓶啤酒,一个人买了100瓶啤酒,他最后能够喝到多少瓶?

注:买的总数是不定的!

作者: iove6600   发布时间: 2013-05-18

本帖最后由 海角 于 2013-5-18 16:39 编辑

99        +33     12   3    2
1+33  11+1     4     2

function m_c($num, $d) {
        if ($num > $d) {
                $n = $num - $num % $d;
                $num = intval($num / $d) + $num % $d;
                return $n + m_c($num, $d);
        } else {
                return $num;
        }
}

$mm = m_c(100, 3);
echo $mm;

作者: 海角   发布时间: 2013-05-18

100+33+11+3+1

作者: kenvinwei   发布时间: 2013-05-18

无解

作者: diyad   发布时间: 2013-05-18

一看到这类型,我就想到递归,一想到递归,就想到递归的终结条件(当瓶盖小于3的时候)。

作者: 燧人氏   发布时间: 2013-05-20

function beer($total, $group = 3)
{
    if ($total > $group) {
        $extra = floor($total / $group);
        return $total + beer($extra, $group);
    } else {
        return $total;
    }
}

作者: 燧人氏   发布时间: 2013-05-20

100+33+11+3+1

作者: witer666   发布时间: 2013-05-20

答案都不太对劲儿~
买9瓶的话他其实能到手13瓶!{:soso_e141:}

作者: iove6600   发布时间: 2013-05-20

我能说这个程序是错的么?

作者: houlai   发布时间: 2013-05-20

houlai 发表于 2013-5-20 14:38
我能说这个程序是错的么?

function m_c($num, $d) {
        if ($num >=$d) {
                $n = $num - $num % $d;
                $num = intval($num / $d) + $num % $d;
                return $n + m_c($num, $d);
        } else {
                return $num;
        }
}

$mm = m_c(100, 3);
echo $mm;

加个等号就对了!

作者: iove6600   发布时间: 2013-05-20

iove6600 发表于 2013-5-20 14:40
function m_c($num, $d) {
        if ($num >=$d) {
                $n = $num - $num % $d;

我能说加了等号也不对么?

作者: houlai   发布时间: 2013-05-20

houlai 发表于 2013-5-20 14:41
我能说加了等号也不对么?

那你怎么写!

作者: iove6600   发布时间: 2013-05-20

iove6600 发表于 2013-5-20 14:55
那你怎么写!

你想一下买10瓶可以喝几瓶就知道怎么写了。
这个在小学就讲过了。

作者: houlai   发布时间: 2013-05-20

houlai 发表于 2013-5-20 15:04
你想一下买10瓶可以喝几瓶就知道怎么写了。
这个在小学就讲过了。

14瓶!是对的~~

作者: iove6600   发布时间: 2013-05-20

iove6600 发表于 2013-5-20 15:11
14瓶!是对的~~

仁者见仁,智者见智,你去百度一下,在说是多少瓶吧。

作者: houlai   发布时间: 2013-05-20

houlai 发表于 2013-5-20 15:14
仁者见仁,智者见智,你去百度一下,在说是多少瓶吧。

难道你的意思借个瓶盖再喝一瓶?然后还一个瓶盖回去?

作者: iove6600   发布时间: 2013-05-20

怎么个错法也说不出来?
就会XXYY的。
什么玩意。

作者: 海角   发布时间: 2013-05-20

海角 发表于 2013-5-20 15:38
怎么个错法也说不出来?
就会XXYY的。
什么玩意。

没问题~
你的程序就是少个等号!
他的想法应该是我上面说的那个,借个瓶盖之类的!

作者: iove6600   发布时间: 2013-05-20

海角 发表于 2013-5-20 15:38
怎么个错法也说不出来?
就会XXYY的。
什么玩意。

容不得半点质疑,可知你的肚量有多大。

作者: houlai   发布时间: 2013-05-20

iove6600 发表于 2013-5-20 15:25
难道你的意思借个瓶盖再喝一瓶?然后还一个瓶盖回去?

对,就是借瓶盖的问题,计算,就应该计算出这种可能,你要把最大的可能算出来,才能知道你的策略的成本有多大,才能决定可行不可行。

作者: houlai   发布时间: 2013-05-20

其实你这个问题,简单点说就是买两瓶送一瓶,所以问题就很简单了 floor( n / 2 * 3) 就是答案。

递归是可以解决,可是成本很高。

作者: houlai   发布时间: 2013-05-20

houlai 发表于 2013-5-20 16:20
对,就是借瓶盖的问题,计算,就应该计算出这种可能,你要把最大的可能算出来,才能知道你的策略的成本有 ...

真汗了!
这借瓶盖的做法没有一种偷换概念的嫌疑么。。。
不可行吧?!

作者: iove6600   发布时间: 2013-05-20

iove6600 发表于 2013-5-20 16:50
真汗了!
这借瓶盖的做法没有一种偷换概念的嫌疑么。。。
不可行吧?! ...

关键得看你定的规矩是给机器玩的还是人玩的,给人玩,你就不知道他那个瓶盖从哪来了。

作者: houlai   发布时间: 2013-05-20

function drink($count) {

      static $drink=0;


      $var=floor($count/3);
      $drink=$drink+$var;
      if($var>=3){

          drink($var);

      }



      return $drink+$count;



}

作者: 弱水寒   发布时间: 2013-05-20

本帖最后由 海角 于 2013-5-20 19:07 编辑

2 4 6
3  6 9
x =2n
y=3n
function m_2to3($num,$isb=true){
          $y = 3*$num/2;
          $isfloat = is_float($y);
          
          if(!$isfloat && $isb) {
                  $result = $y -1;
          }else {
                  $result = floor($y);
          }
         return $result;
}

$result =  m_2to3(104);
echo $result;

作者: 海角   发布时间: 2013-05-20

houlai 发表于 2013-5-20 16:26
其实你这个问题,简单点说就是买两瓶送一瓶,所以问题就很简单了 floor( n / 2 * 3) 就是答案。

递归是可 ...

好思路,这样简单多了

作者: tianyuphp5   发布时间: 2013-05-21