您的位置:首页 > 其它

01背包问题

2017-02-07 20:48 316 查看
01背包问题

一个背包总容量为V,现在有N个物品,第i个 物品体积为weight[i],价值为value[i],现在往背包里面装东西,怎么装能使背包的内物品价值最大?

我们可以这样考虑:在物品比较少,背包容量比较小时怎么解决?用一个数组f[i][j]表示,在只有i个物品,容量为j的情况下背包问题的最优解,那么当物品种类变大为i+1时,最优解是什么?第i+1个物品可以选择放进背包或者不放进背包(这也就是0和1),假设放进背包(前提是放得下),那么f[i+1][j]=f[i][j-weight[i+1]+value[i+1];如果不放进背包,那么f[i+1][j]=f[i][j]。

由此得出状态转移方程:

f[i+1][j]=max(f[i][j],f[i][j-weight[i+1]+value[i+1])

给出一段代码:  

int f[10][2000];//全局变量,自动初始化为0  

int weight[10];  

int value[10];  

#define  max(x,y)   (x)>(y)?(x):(y)  

int main()  

{  

      

    int N,M;  

    cin>>N;//物品个数  

    cin>>M;//背包容量  

    for (int i=1;i<=N; i++)  

    {  

        cin>>weight[i]>>value[i];  

    }  

    for (int i=1; i<=N; i++)  

        for (int j=1; j<=M; j++)  

        {  

            if (weight[i]<=j)  

            {  

                f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]);//状态转移方程

            }  

            else  

                f[i][j]=f[i-1][j];  

        }  

      

    cout<<f
[M]<<endl;  

  }  

上面的代码用了一个二维数组存储,下面试着用一维数组存储  

int f[2000];//全局变量,自动初始化为0  

int weight[10];
 

int value[10];
 

#define  max(x,y)   (x)>(y)?(x):(y)  

int main()
 

{  

    int N,M;
 

    cin>>N;//物品个数 

    cin>>M;//背包容量 

    for (int i=1;i<=N; i++)
 

    {  

        cin>>weight[i]>>value[i];  

    }  

    for (int i=1; i<=N; i++)
 

        for (int j=M; j>=1; j--)
 

        {  

            if (weight[i]<=j)
 

            {  

               f[j]=max(f[j],f[j-weight[i]]+value[i]);  

            }             

        }  

  
  cout<<f[M]<<endl;//输出最优解   

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: