#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;
}
0/1背包问题
最新推荐文章于 2024-09-13 16:27:15 发布
本文详细介绍了动态规划方法在解决背包问题中的应用,通过`Package_Value`函数展示如何通过递推和贪心策略优化空间和时间复杂度,通过给定的示例代码展示了如何计算不同权重下物品的最优价值。
摘要由CSDN通过智能技术生成