//构造函数1CPackage01_Problem::CPackage01_Problem(){ this->m_ItemCount = 5; unsigned int price[] = {3, 4, 6, 5, 6}; unsigned int size[] = {2, 5, 2, 6, 4}; this->m_pItemPrice = new unsigned int[this->m_ItemCount]; this->m_pItemSize = new unsigned int[this->m_ItemCount]; for (unsigned int i=0; i<this->m_ItemCount; i++) { this->m_pItemPrice[i] = price[i]; this->m_pItemSize[i] = size[i]; } this->m_PackageSize = 10;}//构造函数2CPackage01_Problem::CPackage01_Problem(unsigned int* ItemPrice, unsigned int ItemCount, unsigned int* ItemSize, unsigned int PackageSize){}CPackage01_Problem::~CPackage01_Problem(){ if (nullptr != this->m_pItemPrice) { delete[] this->m_pItemPrice; this->m_pItemPrice = nullptr; } if (nullptr != this->m_pItemSize) { delete[] this->m_pItemSize; this->m_pItemSize = nullptr; }}unsigned int CPackage01_Problem::Get01_Result(){ unsigned int* m_PackageMatrix = new unsigned int[this->m_ItemCount*(this->m_PackageSize+1)]; //定义 memset(m_PackageMatrix, 0, sizeof(unsigned int)*this->m_ItemCount*(this->m_PackageSize+1)); //清零 unsigned int m_cols = this->m_PackageSize+1; for (unsigned int i=1; i<=this->m_PackageSize; i++) { for (unsigned int j=0; j<this->m_ItemCount; j++) { if (i < this->m_pItemSize[j]) { if (0 == j) { m_PackageMatrix[j*(this->m_PackageSize+1) + i] = 0; } else { m_PackageMatrix[j*m_cols + i] = m_PackageMatrix[(j-1)*m_cols + i]; } } //背包太小了装不下该商品 else { unsigned int temp_value(0); if (0 == j) { m_PackageMatrix[j*m_cols + i] = this->m_pItemPrice[j]; continue; } //第一个商品可以放入背包,之前背包中没有东西先放进去再说,不是价值最大的就回溯 else { temp_value = m_PackageMatrix[(j - 1)*m_cols + i - this->m_pItemSize[j]] + this->m_pItemPrice[j]; } m_PackageMatrix[j*m_cols + i] = temp_value > m_PackageMatrix[(j-1)*m_cols + i] ? temp_value : m_PackageMatrix[(j-1)*m_cols + i]; } //背包的容量可以装下该商品了, } //选区的商品变化 } //背包容量变化 for (unsigned int i = 0; i < this->m_ItemCount; i++) { for (unsigned int j = 0; j <= this->m_PackageSize; j++) { std::cout << m_PackageMatrix[i*m_cols + j] <<" "; } std::cout << std::endl; } //打印中间矩阵 //寻找背包问题的解 unsigned int packagesize = this->m_PackageSize; //获取背包的体积 cout << "/t价格" << "/t大小" << endl; for (unsigned int i=this->m_ItemCount-1; i>=0; i--) { if (packagesize == 0) { break; } //余量为0了退出 if (i == 0 && packagesize > 0) { cout << "/t" << this->m_pItemPrice[i] << "/t" << this->m_pItemSize[i] << endl; break; } //找到了最后一个商品但是还有余量 则添加进结果 unsigned pos = (packagesize -this->m_pItemSize[i]) < 0? 0:(packagesize -this->m_pItemSize[i]); //防止寻址越界 if (m_PackageMatrix[i*m_cols + packagesize] - m_PackageMatrix[(i-1)*m_cols + pos] == this->m_pItemPrice[i]) { cout << "/t" << this->m_pItemPrice[i] << "/t" << this->m_pItemSize[i] << endl; packagesize -= this->m_pItemSize[i]; } //当前商品对应重量余量 减去 该商品的上一个商品对应背包容量(当前容量减去当前商品大小) //对应的价格等于现在商品的价格时既是需要寻找的商品 } delete[] m_PackageMatrix; m_PackageMatrix = nullptr; return 0;}#pragma once//O1背包问题class CPackage01_Problem{public: CPackage01_Problem(); CPackage01_Problem(unsigned int* ItemPrice, unsigned int ItemCount, unsigned int* ItemSize, unsigned int PackageSize); ~CPackage01_Problem();private: unsigned int* m_pItemPrice; //商品的单价数组 unsigned int* m_pItemSize; //商品的重量 unsigned int m_ItemCount; //商品的总数目 unsigned int m_PackageSize; //背包的大小public: unsigned int Get01_Result();};3. 结果
新闻热点
疑难解答