使用动态规划法解决0/1背包问题

时间:2022-07-04 18:43:34

问题:

给定n种物品和一个背包i(1<=i<=n)的重量是Wi,其价值为Vi,背包的容量为C,对每种物品只能有两种选择:装入或者不装入背包。如何选择装入背包的物品使得装入背包中的物品的总价值最大?


算法使用C++语言实现:


 
 


/**
w[]:物品的重量数组:2,2,6,5,4
v[]:物品的价值数组:6,3,5,4,6
n:物品的数量:5
C:背包的容量:10
x[5]:存储物品拿与不拿的状态的数组
*/

#include<iostream.h>

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;
             }
             cout<<"选中的物品是:"<<endl;
             for(i=0;i<n;i++)
                 cout<<x[i]<<endl;
         return V[n-1][C];
         
 }
 
 void main()
 {
     int s;//获得的最大价值
     int w[5];//物品的重量
     int v[5];//物品的价值
     int x[5];//物品的选取状态
     int n,i;
     int C;//背包最大容量
     cout<<"请输入背包的最大容量:"<<endl;
     cin>>C;
     cout<<"物品数量:"<<endl;
     cin>>n;
     cout<<"请分别输入物品的重量:"<<endl;
     for(i=0;i<n;i++)
         cin>>w[i];
     cout<<"请分别输入物品的价值:"<<endl;
     for(i=0;i<n;i++)
         cin>>v[i];
     s=KnapSack(n,w,v,x,C);
     cout<<"最大价值为:"<<s<<endl;

 }

使用动态规划法解决0/1背包问题