背包问题学习笔记(二)

0-1背包问题解决代码,腾讯的试题中,只需将物品的价值与物品的重量取一样的值即可。

PackProblemClass.h:

// PackProblemClass.h: interface for the PackProblemClass class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_PACKPROBLEMCLASS_H__60EB89B2_4A0F_4085_8973_AC42DE6842E5__INCLUDED_)
#define AFX_PACKPROBLEMCLASS_H__60EB89B2_4A0F_4085_8973_AC42DE6842E5__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class PackProblemClass  
{
public:
	int S;//背包的容量为S
	int N;//物品的件数为N
	int *w;//物品的重量 N维数组
	int *v;//物品的价值 N维数组
	int *x;//背包装的物品价值最大时对应的物品种类 N维数组 x[i]=1表示第i个物品在背包中
	int V;//背包能装下的最大价值
	void DynamicProgramming();//进行动态规划,计算最大价值V,和对应的物品组合x
	void ResultOutput();//将动态规划结果输出
	PackProblemClass(int iS,int iN,int *iw,int *iv);//构造函数
	virtual ~PackProblemClass();//析构函数
	

};

#endif // !defined(AFX_PACKPROBLEMCLASS_H__60EB89B2_4A0F_4085_8973_AC42DE6842E5__INCLUDED_)

 PackProblemClass.cpp:

// PackProblemClass.cpp: implementation of the PackProblemClass class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PackProblemClass.h"
#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//背包问题类
PackProblemClass::PackProblemClass(int iS,int iN,int *iw,int *iv)
{
	this->S = iS;//背包的容量为S
	this->N = iN;//物品的件数为N
	this->w = iw;//物品的重量 N维数组
	this->v = iv;//物品的价值 N维数组
	this->V = 0;//背包能装下的最大价值
	this->x = new int[N];//背包装的物品价值最大时对应的物品种类 N维数组 x[i]=1表示第i个物品在背包中
	for(int i=0;i<N;i++)//初始化x
	{
		x[i] = 0;
	}
}

void PackProblemClass::DynamicProgramming()//进行动态规划,计算最大价值V,和对应的物品组合x
{

	int temp_S = S + 1;
	int i,j; 
	//动态定义并初始化二维数组
	int **c;
	c = new int*[N+1];
	for(i=0;i<=N;i++)
	{
		c[i] = new int[temp_S];
	}
	for(i=0;i<=N;i++)
	{
		for(j=0;j<=S;j++)
		{
			c[i][j] = 0;
		}
	}
	//////////////////////////
	//根据公式c[i][j]=MAX{c[i-1][j],c[i-1][j-w[i-1]+v[i-1]]}计算c[][]
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=S;j++)
		{
			if (j>=w[i-1]) {
				if (c[i-1][j]<(c[i-1][j-w[i-1]]+v[i-1])) {
					c[i][j] = c[i-1][j-w[i-1]]+v[i-1];
				}else
				{
					c[i][j] = c[i-1][j];
				}

			}else
			{
				c[i][j] = c[i-1][j];
			}
		}
	}
	//输出c[][]
	for(i=0;i<=N;i++)
	{
		for(j=0;j<=S;j++)
		{
			cout<<c[i][j]<<"  ";
		}
		cout<<endl;
	}
	/////////////////////////////////////////////////////////////
	//逆推法计算最大值V时对应的物品组合x
	V = c[N][S];
	temp_S = S;
	for(i=N;i>0;i--)
	{
		if (c[i][temp_S]>c[i-1][temp_S]) {
			x[i-1] = 1;
			temp_S = temp_S - w[i-1];
		}

	}

}

void PackProblemClass::ResultOutput()//将动态规划结果输出
{
	cout<<"背包的容量:"<<S<<endl;
	cout<<"物品的件数:"<<N<<endl;
	cout<<"物品的重量:"<<endl;
	int i;
	for(i=0;i<N;i++)
		cout<<w[i]<<" "<<endl;
	cout<<endl;

	cout<<"物品的价值:"<<endl;
	for(i=0;i<N;i++)
		cout<<v[i]<<" "<<endl;
	cout<<endl;

	cout<<"动态规划的结果为:"<<endl;
	cout<<"背包所能装下的物品的最大价值为:"<<V<<endl;

	cout<<"物品的种类:"<<endl;
	for(i=0;i<N;i++)
		cout<<x[i]<<" "<<w[i]<<" "<<v[i]<<endl;
	cout<<endl;


}


PackProblemClass::~PackProblemClass()
{

}

 

posted on 2014-10-28 15:49  中二向箔  阅读(136)  评论(0编辑  收藏  举报

导航