背包问题学习笔记(二)
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()
{
}
浙公网安备 33010602011771号