问题描述 :
给定n种物品,每种物品只有一个,每种物品的体积为,价值为
,给定一个体积为c的背包,问如何装才能使价值最大。
分析思路:
背包可以装的最大价值为:
按顺序第一件放进背包的是物品1时的价值为:,
其中:为从物品2开始选择放入背包,体积为
时的最大价值,则有:
#include <iostream>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
#define MAX 100
int volume[MAX] = { 2, 7 , 14, 3 , 6, 6, 23, 2, 0};
int value[MAX] = { 23, 32, 90, 23, 12, 23, 43, 9, 0 };
static int num;
int selected_item[100000][MAX] = {0}; // [V][i] 空间剩余V时选择第i件物品开始装包的最大价值
int ValueMaximum(int V, int start) //从第start件物品开始装包
{
int max_value = 0;
int value_i;
if (start == num || V <= 0)
{
return 0;
}
for (int i = start; i < num; i++)
{
if (V - volume[i] >= 0)
{
value_i = ValueMaximum(V - volume[i], i + 1) + value[i];
if (max_value < value_i)
{
max_value = value_i;
selected_item[V][i] = value_i;
}
}
}
return max_value;
}
int PrintI(int V, int max) //打印最佳装包方案
{
int i;
if (max == 0) return 0;
for (i = 0; i < num; i++)
{
if (selected_item[V][i] == max)
{
printf("%d ", i);
PrintI(V-volume[i], max - value[i]);
break;
}
}
return 0;
}
int main()
{
int i;
int V;
//scanf_s("%d", &num); //输入
//if (num > MAX)
// return 0;
//for (i = 0; i < num; i++)
// scanf_s("%d", &volume[i]);
//for (i = 0; i < num; i++)
// scanf_s("%d", &value[i]);
//scanf_s("%d", &V);
num = 8;
V = 36;
int value_max = ValueMaximum(V, 0);
PrintI(V, value_max);
return 0;
}