首页 > 代码库 > 背包问题学习笔记(二)
背包问题学习笔记(二)
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 > 1000class 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(){}
背包问题学习笔记(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。