01背包问题

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])

给出一段代码:  

  1. int f[10][2000];//全局变量,自动初始化为0  
  2. int weight[10];  
  3. int value[10];  
  4. #define  max(x,y)   (x)>(y)?(x):(y)  
  5. int main()  
  6. {  
  7.       
  8.     int N,M;  
  9.     cin>>N;//物品个数  
  10.     cin>>M;//背包容量  
  11.     for (int i=1;i<=N; i++)  
  12.     {  
  13.         cin>>weight[i]>>value[i];  
  14.     }  
  15.     for (int i=1; i<=N; i++)  
  16.         for (int j=1; j<=M; j++)  
  17.         {  
  18.             if (weight[i]<=j)  
  19.             {  
  20.                 f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]);//状态转移方程
  21.             }  
  22.             else  
  23.                 f[i][j]=f[i-1][j];  
  24.         }  
  25.       
  26.     cout<<f[N][M]<<endl;  
  27.   }  
上面的代码用了一个二维数组存储,下面试着用一维数组存储  

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;//输出最优解   

}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值