问题重述
0-1背包问题是指在给定一组物品和一个容量为若干的背包时,选择将哪些物品装入背包,使得装入的物品的总体积不超过背包容量,并且所装物品的总价值最大化。其中每个物品只有一个,即要么装入要么不装入,不能切分。因此称为0-1背包问题。该问题是计算机科学中的经典问题,具有重要的理论和实际应用价值。
问题求解
关于此问题的求解有两种方式
- 动态规划
- 贪心算法
此处我们只列举贪心算法求解
#include "iostream"
#include "algorithm"
/**.
* 设置商品的个数
*/
#define N 5
struct node {
/**.
* 体积
*/
int v;
/**.
* 价值
*/
int w;
} goods[5];
void initGoods() {
goods[0].v = goods[0].w = 0;
goods[1].v = 1;
goods[1].w = 2;
goods[2].v = 2;
goods[2].w = 4;
goods[3].v = 3;
goods[3].w = 4;
goods[4].v = 4;
goods[4].w = 5;
}
/**.
* 根据价值选择最合适的搭配策略
* @param V 最大容积
*/
int putAccordingToValue(int V) {
int bagValue = 0;
for (auto &good: goods) {
if (good.v <= V) {
V = V - good.v;
bagValue += good.w;
}
}
return bagValue;
}
void print() {
for (auto &good: goods) {
// 打印输出
std::cout << good.v << " : " << good.w << std::endl;
}
}
/**.
* 程序的主函数
* @return 主函数参数
*/
int main() {
initGoods();
/* std::sort(goods, goods + N, [](node &one, node &two) {
if (one.w == two.w) {
return one.v < two.v;
}
return one.w > two.w;
});*/
std::sort(goods, goods + N, [](node &one, node &two) {
if ((float) one.w / one.v == (float) two.w / two.v) {
return one.v < two.v;
}
return (float) one.w / one.v > (float) two.w / two.v;
});
/* std::sort(goods, goods + N, [](node &one, node &two) {
if (one.v == two.v) {
return one.w > two.w;
}
return one.v < two.v;
});*/
print();
// 打印输出
std::cout << "putAccordingToValue(5): " << putAccordingToValue(5)
<< std::endl;
// 设置程序的默认返回值
return 0;
}
此处通过切换使用不能的排序算法就可以实现不同方式求解背包问题,当然,这是基于贪心算法的,动态规划需要请留言