一切皆可抽象

          大而無(wú)形 庖丁解牛 厚積薄發(fā) 滌慮玄覽
             ::  ::  ::  ::  :: 管理

          【原創(chuàng)】蘋(píng)果裝箱的算法

          Posted on 2005-10-12 13:52 鋒出磨礪 閱讀(2120) 評(píng)論(8)  編輯  收藏 所屬分類(lèi): java算法雜談

          如果你有一千個(gè)蘋(píng)果,有十個(gè)箱子,那么現(xiàn)在我要把一千個(gè)蘋(píng)果放進(jìn)十個(gè)箱子里面,
          放了完之后,不管誰(shuí)跟我要多少蘋(píng)果(包括1000以?xún)?nèi)的喲),我都可以整箱整箱給
          他,這個(gè)問(wèn)題有解嗎?

          我的思路。
          我從1開(kāi)始推理的。如果你需要1個(gè),必然有1個(gè)箱子裝一個(gè)。
          需要兩個(gè),要么給一個(gè)箱子裝2個(gè),要么再裝一個(gè)的箱子。感覺(jué)
          還是裝2個(gè)為一箱比較好。那么需要3個(gè)時(shí)候,就1+2了,那么你需要4個(gè)怎么辦。
          是裝一個(gè)4個(gè)呢,還是裝一個(gè)或者2個(gè)呢。為了省箱子,我裝4個(gè)。
          此時(shí),我發(fā)現(xiàn)了規(guī)律,1,2,4。那么下一個(gè)是8,再下去就是16了,接著32。
          。。。。。。。
          如果有100個(gè),到32的時(shí)候,下一個(gè)就是64了,總數(shù)超過(guò)100了。思路改為
          100-(1+2+4+8+16+32)=37。最后一個(gè)箱子裝37個(gè)。
          當(dāng)要求的蘋(píng)果數(shù)在1+2+4+8+16+32=63 和100之間的時(shí)候,將算法推諉
          給前面即可。就是先拿37個(gè),剩下的從以前的箱子拼湊。
          至此,推理完畢。

          java實(shí)現(xiàn)代碼


          /**
           * <p>Title: </p>
           * <p>Description: </p>
           * <p>Copyright: Copyright (c) 2005</p>
           * <p>Company: </p>
           * @author not attributable
           * @version 1.0
           */

          public class Box {
            private int limit;
            private int code;
            private int applenum;


            public Box(int code,int applenum,int limit) {
               this.limit = limit;
               this.code  = code;
               this.applenum = applenum;

            }
            public int getApplenum() {
              return applenum;
            }
            public int getCode() {
              return code;
            }
            public int getLimit() {
              return limit;
            }
            public void setLimit(int limit) {
              this.limit = limit;
            }
            public void setCode(int code) {
              this.code = code;
            }
            public void setApplenum(int applenum) {
              this.applenum = applenum;
            }

          }


          /**
           * <p>Title: </p>
           * <p>Description: </p>
           * <p>Copyright: Copyright (c) 2005</p>
           * <p>Company: </p>
           * @author not attributable
           * @version 1.0
           */

          public class Apple {
            public Apple() {
            }
            final private int max=100;   // 蘋(píng)果總數(shù)
            static int   xqs = 99;       // 你需要的蘋(píng)果數(shù)
            private java.util.Vector Boxvec = new java.util.Vector(); // 箱子和箱子里的蘋(píng)果
            private int ai =0;
            private int k = 1;
            public static void main(String args[])
            {
              Apple apple = new Apple();
              apple.InBox(1);
              System.out.println("共需裝"+apple.GetBoxVec().size()+"箱");
              for (int i=0;i<apple.GetBoxVec().size();i++)
              {
                Box box = (Box)apple.GetBoxVec().get(i);
                System.out.println("第 ‘"+box.getCode()+"’ 箱裝'"+box.getApplenum()+"' ");
              }
              apple.GetApple(xqs,apple.GetBoxVec());
            }

            public void GetApple(int x,java.util.Vector vec)
            {
              if (x==1)
              {
               System.out.println("拿第一箱玩去,就1個(gè)");
              }
              else
              {
                if (x != 0) {
                  int key = 0;
                  for (int i = 0; i < vec.size() - 1; i++) {
                    Box xbox = (Box) vec.get(i);
                    Box ybox = (Box) vec.get(i + 1);
                    if (x > xbox.getLimit() && x <= ybox.getLimit()) {
                      key = i + 2;
                      System.out.println("拿第" + ybox.getCode() + "箱給他,共" +
                                         ybox.getApplenum() + "個(gè)");
                      GetApple(x - ybox.getApplenum(), vec);
                    }
                  }
                }
                else
                  System.out.println("完成");
              }

            }

            public void InBox(int i)
            {
              if ((i+i)>=max)
              {
                Box box = new Box(k,max-ai,max);
                Boxvec.add(box);
              }
              else
              {
                Box box = new Box(k,i,i+ai);
                k++;
                Boxvec.add(box);
                ai = ai + i;
                InBox(i+i);
              }
            }
            public java.util.Vector GetBoxVec()
            {
              return Boxvec;
            }

          }


          評(píng)論

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2005-10-14 18:42 by 小虎
          1,1,2,5,10,20,50,100,200,500
          這樣行嗎?

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2005-10-16 11:19 by 鋒出磨礪
          小虎:你的算法,如果我需要40,90,140,190,240,290。。。看來(lái)是無(wú)法給我了。

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2005-10-16 21:45 by 小虎
          不好意思 沒(méi)考慮好^_^!

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2006-08-25 01:13 by LittleBug
          1,2,4,8,16,32,64,128,256,489
          對(duì)嗎?

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2006-08-25 01:14 by LittleBug
          但是我不懂其中的規(guī)律

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2008-05-20 17:16 by why0603
          9*1 + 9*10 + 9*100 = 999

          哎!其實(shí)根據(jù)RMB的搭配,可以將
          9*1=(1+2+3+4)*1
          9*10=(1+2+3+4)*10
          ......
          雷同
          這樣的話(huà)箱子的數(shù)目真是太少了....
          MY GOD,啥思想

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2008-05-20 17:22 by why0603
          再修正一次
          當(dāng)10*1后,只需要9*10
          so 9*10 = (2+3+4)*10
          so 9*100 = (2+3+4)*100
          so 10*1 = (1+2+3+4)*1

          # re: 【原創(chuàng)】蘋(píng)果裝箱的算法  回復(fù)  更多評(píng)論   

          2009-04-25 09:30 by kitto
          1 1 3 5 10 30 50 100 300 500
          主站蜘蛛池模板: 金乡县| 永兴县| 西华县| 巴林左旗| 安陆市| 措美县| 鸡东县| 福清市| 十堰市| 称多县| 漯河市| 阆中市| 蒙山县| 台南县| 秦安县| 寻乌县| 扬中市| 北票市| 沭阳县| 永清县| 宾川县| 湟中县| 万源市| 沾化县| 红安县| 游戏| 平罗县| 义马市| 临洮县| 绍兴市| 锦屏县| 溧水县| 康定县| 故城县| 丰都县| 兴仁县| 读书| 武穴市| 东源县| 策勒县| 新平|