背包问题:有N件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
背包问题的数学表达式为:
其中表示将i件物品放在容量为W的背包中能放的物品的最大价值
表示第i件商品的重量,
表示第i件商品的价值
表示i-1件商品放入容量为W的背包中能放的物品的最大价值
根据上述公式编写代码如下:
#include<stdio.h>
#define BACKPACT_TOTAL_WEIGHT 6 //背包能承受的最大重量
#define ITEM_NUMS 5 //物品的总数
//物品结构体
typedef struct
{
int weight; //物品的重量
int value; //物品的价值
}ITEM;
ITEM items[ITEM_NUMS] = { { 2, 6 }, //定义物品的数组
{ 2, 3},
{ 6, 5},
{ 6, 4},
{ 4, 6}};
/*
*item_numbers 物品的数量
*backpack_total_weight 背包的总重量
*/
int get_value(int item_numbers, int backpact_total_weight)
{
int ret1 = 0;
int ret2 = 0;
if (0 == item_numbers)
{
return (items[item_numbers].weight <= backpact_total_weight ? items[item_numbers].value : 0);
}
ret1 = get_value(item_numbers - 1, backpact_total_weight);
if ((backpact_total_weight - items[item_numbers].weight) <0)
{
ret2 = 0;
}
else
{
ret2 = get_value(item_numbers - 1, backpact_total_weight - items[item_numbers].weight) + items[item_numbers].value;
}
return (ret1 > ret2 ? ret1 : ret2);
}
int main(void)
{
int max_value_of_items = get_value(ITEM_NUMS - 1, BACKPACT_TOTAL_WEIGHT);
printf("放入背包中物品的最大价值为:");
printf("%d", max_value_of_items);
printf("\n");
return 0;
}