0-1背包問題(動態規劃入門)

來源:互聯網
上載者:User

九講背包問題題目

有N件物品和一個容量為V的背包。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入背包可使價值總和最大。

基本思路

這是最基礎的背包問題,特點是:每種物品僅有一件,可以選擇放或不放。

用子問題定義狀態:即f[i][v]表示前i件物品恰放入一個容量為v的背包可以獲得的最大價值。則其狀態轉移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

這個方程非常重要,基本上所有跟背包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:“將前i件物品放入容量為v的背包中”這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為一個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為“前i-1件物品放入容量為v的背包中”,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為“前i-1件物品放入剩下的容量為v-c[i]的背包中”,此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。

以下粘貼的原始碼。

int V[200][200];//前i個物品裝入容量為j的背包中獲得的最大價值 int max(int a,int b) {    if(a>=b)        return a;    else return b; }  int KnapSack(int n,int w[],int v[],int x[],int C) {     int i,j;     for(i=0;i<=n;i++)         V[i][0]=0;     for(j=0;j<=C;j++)         V[0][j]=0;     for(i=0;i<=n-1;i++)         for(j=0;j<=C;j++)             if(j<w[i])                 V[i][j]=V[i-1][j];             else                 V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);             j=C;             for(i=n-1;i>=0;i--)             {                 if(V[i][j]>V[i-1][j])                 {                 x[i]=1;                 j=j-w[i];                 }             else                 x[i]=0;             }             printf("選中的物品是:\n");             for(i=0;i<n;i++)                 printf("%d ",x[i]);             printf("\n");         return V[n-1][C];          }  void main() {     int s;//獲得的最大價值     int w[15];//物品的重量     int v[15];//物品的價值     int x[15];//物品的選取狀態     int n,i;     int C;//背包最大容量     n=5;     printf("請輸入背包的最大容量:\n");     scanf("%d",&C);          printf("輸入物品數:\n");     scanf("%d",&n);     printf("請分別輸入物品的重量:\n");     for(i=0;i<n;i++)         scanf("%d",&w[i]);      printf("請分別輸入物品的價值:\n");     for(i=0;i<n;i++)         scanf("%d",&v[i]);      s=KnapSack(n,w,v,x,C);      printf("最大物品價值為:\n");     printf("%d\n",s);          }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.