背包問題初步入門–背包1

來源:互聯網
上載者:User

引言:對背包是又愛又恨,代碼看的懂,但是並不代表你就掌握了背包,做過題的都知道,建模是應該是有難度的!所以正在為背包頭疼的同學加油,毅力能戰勝一切喲。

 

動態規劃是用空間換時間的一種方法的抽象。其關鍵是發現子問題和記錄其結果。然後利用這些結果減輕運算量。
比如01背包問題。

/* 一個旅行者有一個最多能用M公斤的背包,現在有N件物品,
它們的重量分別是W1,W2,...,Wn,
它們的價值分別為P1,P2,...,Pn.
若每種物品只有一件求旅行者能獲得最大總價值。
輸入格式:
M,N
W1,P1
W2,P2
......
輸出格式: 

*/

因為背包最大容量M未知。所以,我們的程式要從1到M一個一個的試。比如,開始任選N件物品的一個。看對應M的背包,能不能放進去,如果能放進去,並且還有多的空間,則,多出來的空間裡能放N-1物品中的最大價值。怎麼能保證總選擇是最大價值呢?看下錶。
測試資料:
10,3
3,4
4,5
5,6

看懂這個表格就搞懂了方程式,背包的初步模型,x軸代表遞增的容量,y軸代表物品的個數,裡面黃色的部分代表所獲得的價值。此表格對應代碼看,相信你會很容易看懂的。

c[i][j]數組儲存了1,2,3號物品依次選擇後的最大價值.

這個最大價值是怎麼得來的呢?從背包容量為0開始,1號物品先試,0,1,2,的容量都不能放.所以置0,背包容量為3則裡面放4.這樣,這一排背包容量為4,5,6,....10的時候,最佳方案都是放4.假如1號物品放入背包.則再看2號物品.當背包容量為3的時候,最佳方案還是上一排的最價方案c為4.而背包容量為5的時候,則最佳方案為自己的重量5.背包容量為7的時候,很顯然是5加上一個值了。加誰??很顯然是7-4=3的時候.上一排 c3的最佳方案是4.所以。總的最佳方案是5+4為9.這樣.一排一排推下去。最右下放的資料就是最大的價值了。(注意第3排的背包容量為7的時候,最佳方案不是本身的6.而是上一排的9.說明這時候3號物品沒有被選.選的是1,2號物品.所以得9.)

從以上最大價值的構造過程中可以看出。

f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}這就是書本上寫的動態規劃方程.這回清楚了嗎?

下面是實際程式:

#include<stdio.h>
int c[10][100];/*對應每種情況的最大價值*/
int knapsack(int m,int n)
{
 int i,j,w[10],p[10];
 for(i=1;i<n+1;i++)
        scanf("/n%d,%d",&w[i],&p[i]);
 for(i=0;i<10;i++)
      for(j=0;j<100;j++)
           c[i][j]=0;/*初始化數組*/
 for(i=1;i<n+1;i++)
      for(j=1;j<m+1;j++)
           {
            if(w[i]<=j) /*如果當前物品的容量小於背包容量*/
                     {
                      if(p[i]+c[i-1][j-w[i]]>c[i-1][j])

                           /*如果本物品的價值加上背包剩下的空間能放的物品的價值*/

                         /*大於上一次選擇的最佳方案則更新c[i][j]*/
                            c[i][j]=p[i]+c[i-1][j-w[i]];
                            else
                            c[i][j]=c[i-1][j];
                     }
              else c[i][j]=c[i-1][j];
            }
 return(c[n][m]);
                     
}
int main()
{
    int m,n;int i,j;
    scanf("%d,%d",&m,&n);
    printf("Input each one:/n");
    printf("%d",knapsack(m,n));
    printf("/n");/*下面是測試這個數組,可刪除*/
     for(i=0;i<10;i++)
      for(j=0;j<15;j++)
         {
          printf("%d ",c[i][j]);
             if(j==14)printf("/n");
         }
    system("pause");
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.