问题描述:有若干物品,物品的质量和体积已知。有一个容积固定的背包,怎样在背包中装入质量尽可能大的物品
代码如下,注释应该足够详细,只是代码风格不太优雅(捂脸)
#include<iostream>
#include<vector>using namespace std;//用来定义物品,需要提供质量和体积
class BagObj
{
public:bool isSelected = false;//物品是否被选中int quality = 0;//质量int volume = 0;//体积//传入体积和质量BagObj(int fromVol, int fromQua);
};BagObj::BagObj(int fromVol, int fromQua)
{quality = fromQua;volume = fromVol;
}class BagHandle
{
private:int objNum = 0;//物品的总数int bagVol = 0;//背包的体积vector<BagObj> objList;//物品的属性列表int bagProblemDealCore(int restVol,//剩余的背包体积vector<BagObj>::iterator fromIter//物品开始迭代的位置);
public://需要用户输入相关信息BagHandle();//没有传入参数的构造函数void bagDeal();//开始处理背包问题void resultOutput();//输出结果
};BagHandle::BagHandle()
{//获取背包属性cin >> bagVol;//获取用户输入cin >> objNum;//循环获取每个物品的参数for (int i = 0; i < objNum; ++i){int tempQua = 0;//用于输入的质量int tempVol = 0;//用于输入的体积cin >> tempQua >> tempVol;//将新建的物品对象加入到列表objList.push_back(BagObj(tempVol, tempQua));}
}//用递归的方式解决问题
void BagHandle::bagDeal()
{//新建列表的迭代器vector<BagObj>::iterator iter = objList.begin();//将参数传入到递归函数bagProblemDealCore(bagVol, iter);
}void BagHandle::resultOutput()//输出算法处理的结果
{cout << "体积\t质量" << endl;int qualitySum = 0;//迭代处理结果for (vector<BagObj>::iterator iter = objList.begin();iter != objList.end(); ++iter){//判断物品是否被选中if (iter->isSelected){//输出物品信息cout << iter->volume << "\t" << iter->quality << endl;//计算总的质量qualitySum += iter->quality;}}//输出总的质量cout << qualitySum << endl;
}int BagHandle::bagProblemDealCore(int restVol,//剩余的背包体积vector<BagObj>::iterator fromIter//物品开始迭代的位置
)
{//判断迭代结束的条件if (fromIter == objList.end())return 0;//判断当前物品能否被选取if (fromIter->volume > restVol){fromIter->isSelected = false;//继续下一次迭代return bagProblemDealCore(restVol, fromIter + 1);}//分别比较选与不选int selectedResult = bagProblemDealCore(restVol - fromIter->volume,fromIter + 1) + fromIter->quality;int unSelectedResult = bagProblemDealCore(restVol, fromIter + 1);//如果选取if (selectedResult > unSelectedResult){fromIter->isSelected = true;//选取的情形需要再次被执行,为了修正isselectedreturn bagProblemDealCore(restVol - fromIter->volume,fromIter + 1) + fromIter->quality;}else{fromIter->isSelected = false;return unSelectedResult;}
}int main()
{BagHandle tempBag;tempBag.bagDeal();tempBag.resultOutput();return 0;
}