0/1背包问题-动态规划法
算法实现
设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中,背包容量为C,数组V[n+1][C+1]存放迭代结果,
其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划法求解0/1背包问题的算法如下:
#include <iostream>
using namespace std;
int V[6][7];
int x[5];
#define C 6
int Max(int x,int y);
int KnapSack(int w[],int v[],int n){
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=1;i<=n;i++)
{
for(j=1;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]);
}
}
for (j=C,i=n;i>0;i--) //回溯,求装入背包的物品
{
if (V[i][j]>V[i-1][j])
{
x[i]=1;
j=j-w[i];
}
else x[i] = 0;
}
return V[n][C];
}
int Max(int x,int y){
if(x>y)
return x;
else
return y;
}
int main(){
int w[]={-1,3,2,1,4,5};
int v[]={-1,25,20,15,40,50};
int x1=KnapSack(w,v,5);
cout<<"背包获得的最大价值是:"<<x1<<endl;
cout<<"装入背包的物品是:";
for(int i=1;i<=5;i++)
if (x[i]==1) cout<<"物品"<<i<<" ";
return 0;
}
时间复杂度:O(n*C)
运行结果: