完全背包问题:
有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。
求这个问题的解可以用动态规划,
但是求出来解了又出现另外一个问题
背包里价值最大时,背包里的东西有哪些?
例题:
现在有四个物品,背包总容量为8,背包最多能装入价值为多少的物品?
这题的答案是 13
但是根据答案可行的组合却不是唯一的
组合可以是:
1、1、1、1
1、1、3
3、3
这求所有可能的组合呢?
关于背包问题不懂的我建议去看这个视频
这个视频清楚的讲述了最简单的背包问题。
我求解完全背包问题的代码在这
运行平台:Dev C++、Vs2019
#include <iostream>
using namespace std;
struct Goods {
int vol;
int value;
Goods(int a, int b)
{
this->vol = a;
this->value = b;
}
};
void BeiBao();
int main()
{
BeiBao();
return 0;
}
void BeiBao()
{
int result[9][5];
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 5; j++)
{
result[i][j] = 0;
}
}
Goods goods[4] = { Goods(2, 3), Goods(3, 4), Goods(4, 6), Goods(5, 7) };
for (int i = 1; i < 9; i++)
{
for (int j = 1; j < 5; j++)
{
if (i / goods[j - 1].vol >= 0)
{
int* mid = new int[i / goods[j - 1].vol];
mid[0] = 0;
for (int n = 0; n < i / goods[j - 1].vol; n++)
{
mid[n] = (n + 1) * goods[j - 1].value;
mid[n] += result[i - goods[j - 1].vol * (n + 1)][j];
if (mid[0] < mid[n])
mid[0] = mid[n];
}
result[i][j] = mid[0];
}
if (result[i][j] < result[i][j - 1])
result[i][j] = result[i][j - 1];
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 9; j++)
{
cout << result[j][i] << " ";
}
cout << endl;
}
}