乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      動(dòng)態(tài)規(guī)劃 背包問(wèn)題

       雪柳花明 2016-10-10
      字?jǐn)?shù)1118 閱讀820 評(píng)論1 

      1.問(wèn)題描述

      有n個(gè)物體有重量和價(jià)值兩個(gè)屬性,一個(gè)能承重一定重量的背包。問(wèn)怎么選擇物體能實(shí)現(xiàn)背包里的價(jià)值最大化。

      2.問(wèn)題具體化

      假設(shè)有5個(gè)物體和一個(gè)背包。物體的重量分別是2、2、6、5、4,即w[]={0、2、2、6、5、4},價(jià)值分別是6、3、5、4、6,即v[]={0、6、3、5、4、6}。背包承重為10。問(wèn)怎么選擇,能實(shí)現(xiàn)背包所背物體價(jià)值的最大化。

      3. 解決過(guò)程

      利用二維表格,通過(guò)自左向右、自下向上的計(jì)算,來(lái)繪制表格,左后再在表格的基礎(chǔ)上選擇最優(yōu)解。

      • 3.1表格最后一行

        對(duì)最后一行的物體4來(lái)說(shuō),只有兩種情況,要么裝入背包,要么不裝入。物體5的的重量是4。也就是說(shuō)在背包承重為0--3的時(shí)候物體5是裝不進(jìn)去的,所以背包為0,當(dāng)背包承重為4--10的時(shí)候,物體5可以裝進(jìn)去,又因?yàn)槲矬w5的價(jià)值為6,所以背包價(jià)值為6。

      .012345678910
      1
      2
      3
      4
      500006666666
      • 3.2表格倒數(shù)第二行

        表格倒數(shù)第二行的計(jì)算思路與倒數(shù)第一不一樣,因?yàn)槲覀円紤]背包里已經(jīng)有的物體。因?yàn)槲矬w4的重量為5。所以在背包承重為0--4的情況下即使空包也裝不進(jìn)去,所以不能裝入,包里原本是多少價(jià)值,就還是多少價(jià)值。在背包承重為5--8的時(shí)候,物體4可以裝進(jìn)去,但是物體5要拿出來(lái)才行,這樣的話(huà)背包的價(jià)值就變成4了,小于6。所以能然選擇不把物體4放進(jìn)去。在背包承重為9--10的時(shí)候,兩個(gè)都可以放進(jìn)去,所以背包的價(jià)值變成10了。

      .012345678910
      1
      2
      3
      40000666661010
      500006666666
      • 3.3最終計(jì)算出來(lái)的表格

        其他行的計(jì)算過(guò)程同上,最終結(jié)果如下。

      .012345678910
      10066991212151515
      20033669991011
      30000666661011
      40000666661010
      500006666666
      • 3.4表格計(jì)算公式

        max( m(i+1,j) , m(i+1,j-wi)+vi )

      • 3.5做出最優(yōu)選擇

        大體思想:我們從右上角(坐標(biāo)(1,10))開(kāi)始,看(1,10)與(2,10)的值是不是一樣,一樣,則說(shuō)明物體1沒(méi)裝進(jìn)去,不一樣,則說(shuō)明物體1裝進(jìn)去了。
        void opt_way(int flag[],int w[], int table[num][weight])
        {
        int n = weight-1;
        for (size_t i = 0; i < num; i++)
        {

          if (table[i][n]==table[i+1][n])
          {
              flag[i] = 0;
          }
          else
          {
              flag[i] = 1;
              n = n - w[i+1];
          }

        }
        }


      4.完整代碼

      #include <iostream>
      #define num 5
      #define weight  11
      using namespace std;
      
      void init_table(int table[num][weight])
      {
          for (size_t i = 0; i < num; i++)
          {
              for (size_t j = 0; j < weight; j++)
              {
                  table[i][j] = 0;
              }
          }
      
      }
      void show_table(int table[num][weight])
      {
          for (size_t i = 0; i < num; i++)
          {
              for (size_t j = 0; j < weight; j++)
              {
                  cout <<table[i][j] << "\t";
              }
              cout << "\n";
          }
      
      }
      void creat_table(int table[num][weight],int w[],int v[])
      {
          //給最后一行賦初值
          for (size_t i = 0; i < weight; i++)
          {
              if (w[num] > i)
                  table[num - 1][i] = 0;
              else
              {
                  table[num - 1][i] = v[num];
              }
          }
          //在最后一行基礎(chǔ)上給每行賦值
          for (int i = num - 1; i > 0; i--)
          {
              for (int j = 0; j < weight; j++)
              {
                  if (w[i]>j)
                  {
                      table[i - 1][j] = table[i][j];
                  }
                  else if ((v[i] + table[i][j-w[i]])>table[i][j])
                  {
                      table[i-1][j] = v[i] + table[i ][j - w[i]];
                  }
                  else
                  {
                      table[i-1][j] = table[i][j];
                  }
              }
          }
      
      }
      
      
      
      void opt_way(int flag[],int w[], int table[num][weight])
      {
          int n = weight-1;
          for (size_t i = 0; i < num; i++)
          {
              if (table[i][n]==table[i+1][n])
              {
                  flag[i] = 0;
              }
              else
              {
                  flag[i] = 1;
                  n = n - w[i+1];
              }
          }
      
      }
      int main()
      {
          int w[num+1] = {0,2,2,6,5,4};
          int  v[num+1]= {0,6,3,5,4,6};
          int flag[num] = { 0, 0, 0, 0, 0 };
          int table[num][weight];
          init_table(table);
          creat_table(table,w,v);
          opt_way(flag,w,table);
          //----------------
          show_table(table);
          //------------------------------
          for (size_t i = 0; i < num; i++)
          {
              cout << flag[i];
          }
          getchar();
          return 0;
      }

      5.程序結(jié)果截圖

      11001是最優(yōu)的選擇
      11001是最優(yōu)的選擇

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多