0/1背包动态规划
有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。
设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。
#include
using namespace std;
#define MAX 30
int a[MAX][MAX] = { 0 }, w[MAX] = { 0, 10, 10, 10, 10, 20, 40 }, v[MAX] = { 0, 30, 20, 50 ,15, 20, 40 };
int n =6, W = 40, V = 0, maxv = -1, pes = -1;
void bfs(int s)
{
if (s > n)
{
for (int i = 1; i <= n; i++)
{
if (a[i][0] != 1) continue;
V = 0;
for (int j = 1; j <= n; j++)
{
if (a[i][j] == 1)
V += v[j];
}
if (maxv < V)//判断是否最大价值,然后标记那一组数据
{
maxv = V;
pes = i;
}
}
return;
}
int we=0;
for (int i = 1; i <= n; i++)
{
if (we + w[i] <= W)
{
we += w[i];
a[s][i] = 1;
}
}
if (we == W) a[s][0] = 1;//在数组的首位用1标记重量恰好等于承载重量
bfs(s + 1);
}
int main()
{
bfs(1);
cout << maxv << endl;
for (int i = 1; i <= n; i++)
cout << a[pes][i] << " ";
cout << endl;
return 0;
}