0/1背包问题

本文详细介绍了动态规划方法在解决背包问题中的应用,通过`Package_Value`函数展示如何通过递推和贪心策略优化空间和时间复杂度,通过给定的示例代码展示了如何计算不同权重下物品的最优价值。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
/*动态规划的要领
1、递推思想:知道如何把大规模的问题通过递推公式转化为较小规模的子问题
2、知道最初子问题的初始化状态
3、划分不同状态的状态式子
4、知道DP数组在此状态要表达的问题
5、优化空间复杂度或者时间复杂度
*/
int Package_Value(int value[],int weight[],int content,int sort)
{
	int* package_value = (int*)malloc(sizeof(int)*(content +1));//防止数组越界
	if (package_value == NULL)
		return -1;
	memset(package_value,0,sizeof(int)*(content +1));
	for (int i=0;i<sort;i++)//依次对当前种类进行存取
	{//种类  
		for (int j = content; j >0; j--)//从重量依次递推每个重量段的最好取值
		{//重量
			if (weight[i] <= j)//判断当前的重量是否能存进去
			{
				if ((value[i]+ package_value[j - weight[i] ])>=package_value[j])//判断取当前值的结果和不取当前值的结果对比谁更大
				{
					package_value[j] = value[i] + package_value[j-weight[i]];
				}
			}
		}
	}
	int result = package_value[content];
	free(package_value);
	return result;
}
int main()
{
	int value[] = {1,2,3,4,5};
	int weight[] = {7,5,11,3,6};
	for(int i=0;i<13;i++)
	printf("[%d]:%d\n",i,Package_Value(value,weight,i,sizeof(value)/sizeof(int)));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值