有N件物品和一个容量为V的背包,原方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。
空间复杂度:是对一个算法在运行过程中临时占用存储空间大小的量度
思路:用一维数组优化。因为原表中每个数据都只与上一行有关,通过滚动数组将一行数据代替上一行
/*问题描述:有编号分别为a,b,c,d,e的五件物品,
它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,
每件物品数量只有一个,
现在给你个承重为10的背包,
如何让背包里装入的物品具有最大的价值总和?答案是15*/
/*输入
6 2
3 2
5 6
4 5
6 4
*/
#include<stdio.h>
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
int main()
{
int value[30],weigh[30],dp[80];int i,j,chengzhong=10;
for(i=1;i<=5;i++)
{
scanf("%d %d",&value[i],&weigh[i]);
}
for(i=0;i<=5;i++)//i负责滚动行的次数,j负责容量变化
{
/*结束条件为weigh[i],
若当前物品大于容量,
自动保存上一行原值*/
/*注意倒序,假设当前容量足以装下且
要装入当前物品,
那就需要上一行算出的
dp[j- weigh[i]],
否则当前行更新了dp[j-weigh[i]]结
果就不对*/
for(j=10;j>=weigh[i];j--)
{
if(i==0)
{
dp[j]=0;
}
else
{
dp[j]=max(dp[j],dp[j-weigh[i]]+value[i]);
}
}
}
printf("%d",dp[10]);
return 0;
}