0—1揹包問題

問題描述:
有一個容量爲m(1<=m<=4000000)的揹包,有n(1<=n<=16)個物品,每個物品有體積v(1<=v<=2012)和價值w(0<=2012),現在要你選擇一些物品,使得揹包所裝物品的總價值最大。
Input
有多組測試數據,但是不會超過10組。
對於每組測試數據,第一行是兩個整數m和n,表示揹包容量的和物品個數。接下來有n行,每行有兩個整數,表示一個物品的體積和價值。
輸入到文件結束。
Output
對於每組測試數據,輸出一行,包含一個整數,爲揹包能裝下物品的最大價值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
作者:何知令

完成時間:2017年8月21日

代碼如下:

/*
問題描述:
有一個容量爲m(1<=m<=4000000)的揹包,有n(1<=n<=16)個物品,每個物品有體積v(1<=v<=2012)和價值w(0<=2012),現在要你選擇一些物品,使得揹包所裝物品的總價值最大。
Input
有多組測試數據,但是不會超過10組。
對於每組測試數據,第一行是兩個整數m和n,表示揹包容量的和物品個數。接下來有n行,每行有兩個整數,表示一個物品的體積和價值。
輸入到文件結束。
Output
對於每組測試數據,輸出一行,包含一個整數,爲揹包能裝下物品的最大價值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
作者:何知令
完成時間:2017年8月21日
*/
#include <stdio.h>
int V[100][100];
int n,m;//n爲物品數量,m爲揹包容量
int w[100],v[100];
void FindMax()//動態規劃
{
    int i,j;
    //填表
    for(i=0; i<=n; i++)
    {
        for(j=0; j<=m; j++)
        {
            if(j<w[i])//包裝不進
            {
                V[i][j]=V[i-1][j];
            }
            else//能裝
            {
                if(V[i-1][j]>V[i-1][j-w[i]]+v[i])//不裝價值大
                {
                    V[i][j]=V[i-1][j];
                }
                else//前i-1個物品的最優解與第i個物品的價值之和更大
                {
                    V[i][j]=V[i-1][j-w[i]]+v[i];
                }
            }
        }
    }
    printf("%d\n",V[n][m]);
}
int main()
{
    int i,j;
    while(~scanf("%d %d",&m,&n))
    {
        for(i=0; i<m; i++)
            for(j=0; j<m; j++)
                V[i][j]=0;
        for(i=0; i<n; i++)
            scanf("%d %d",&w[i],&v[i]);
        FindMax();
    }
    return 0;
}
知識點總結:動態規劃,揹包問題

學習心得:又是好久沒發博客了

發佈了302 篇原創文章 · 獲贊 43 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章