0/1背包问题-动态规划法

算法实现
设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中,背包容量为C,数组V[n+1][C+1]存放迭代结果,
其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划法求解0/1背包问题的算法如下:
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)
运行结果:
0/1背包问题-动态规划法