01背包问题优化版

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

发布了11 篇原创文章 · 获赞 0 · 访问量 135

猜你喜欢

转载自blog.csdn.net/weixin_45670020/article/details/104136087