test题目:背包问题

问题描述 :
给定n种物品,每种物品只有一个,每种物品的体积为v_{i},价值为w_{i},给定一个体积为c的背包,问如何装才能使价值最大。 

分析思路:

背包可以装的最大价值为:value[V]

按顺序第一件放进背包的是物品1时的价值为:value[V-v_{1}] + w_{1}

其中:value[V-v_{1}]为从物品2开始选择放入背包,体积为 V-v_{1} 时的最大价值,则有:

value[V] = max(value[V - v_{i}] + w_{i})

#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;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值