背包问题

背包问题有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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值