zoukankan      html  css  js  c++  java
  • 用P1060来讲解01背包

    P1060 开心的金明(基础背包)

    这道题是01背包裸题

    超级难

    首先讲解一下01背包

    01背包的基本模型为 已经拥有的资本(即背包容量)

    可以获得物品的价值和代价(即物品的价值和体积)

    所以我们用最基本的无任何优化的代码实现一下

    for(int i=1;i<=m;i++)//枚举所有物品 一共m个物品 所以从1到m
    {
    	for(int j=0;j<=n;j++)//此处为枚举背包容量  即背包满容量为n
    	{
    		if(j<v[i])//如果当前容量小于当前物品的体积 便无法放下 所以 dp[i][j]状态和dp[i-1][j]一致
    			dp[i][j]=dp[i-1][j];//dp[i][j]代表当前放前i个物品剩余容量为j时的价值
    		else
    			dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);//状态转移方程
    	}
    }
    

      

    可以来用knapsack来模拟样例中的过程(一个01背包小插件)地址为http://karaffeltut.com/NEWKaraffeltutCom/Knapsack/knapsack.html

    继续加油~

    爱老婆.jpg

    4月8日下午更新!

    突然学会了用一维数组优化01背包

    能够降低空间复杂度!

     放上代码和自身理解

    for(int i=1;i<=n;i++)//dp[i]代表重量不超过i的背包的最大可获取价值
    {
        for(int j=m;j>=w[i];j--)//这里dp[]一定要逆序   原因为无优化下 像一个表格 每次使用上一行的数据进行比较 如dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);所以 每次使用为上组数据
        {
            dp[j]=max(dp[j-w[i]]+v[i],dp[j]);
        }
    }

     突然又听说常数可以优化掉???

    在网上找到了代码 可惜 看不懂 等着补博客吧

    人十我百 人百我万
  • 相关阅读:
    著名的小退问题
    Oracle学习笔记(十二)
    Oracle学习笔记(十一)
    Oracle学习笔记(十)
    Oracle学习笔记(九)
    Oracle学习笔记(八)
    Oracle学习笔记(七)
    Oracle学习笔记(六)
    Oracle学习笔记(五)
    Oracle学习笔记(四)
  • 原文地址:https://www.cnblogs.com/bestcoder-Yurnero/p/10669928.html
Copyright © 2011-2022 走看看