首先说明一下01背包

有一个容量为V的背包,另外有N个物品,每个物品Ni都有其对应的体积Vi和价值Pi

求如何取舍装进背包中使得背包里的总价值P达到最大值

题目看似很像贪心问题,把我们不妨先以贪心的思路解决一下这个问题

每个物品都有其对应的价值与体积,我们将其做比,优先选择其比值较高的物品

设:总容量为100,物品N为3

物品A:容量50 价值9K

物品B:容量40 价值7K

物品C:容量55 价值11K

则贪心的选择顺序为->C->B此时A无法装入,舍弃。 虽然只用了95的总容量,但是其价值确实是最大化,看起来似乎没什么不对。

那么我们再看一组数据

物品A:容量50 价值9K

物品B:容量40 价值11K

物品C:容量65 价值19K

假如我们仍以贪心的思路去选择,我们就会发现,即使C的“性价比”很高,但是我们如果选择了他,就无法再装入其他物品,浪费了容量空间,

还不如选择A+B的价值更大。所以,贪心思想解决不了背包的问题。

问题出在哪里了呢? 对于每一个物品我们都有装和不装两种选择,对于计算机而言,就像是0和1两种状态一样,所以这类问题我们称之为01背包

我们纠结的地方就在于我们单独去看一个物品(亦或几个物品)的时候我们并不知道他到底选还是不选,我们也无法保证当看过n个物品后,我将以

多少剩余容量去面对接下来未知的物品。

所以,我们必须要把看过n个物品之后,所有容量的情况全部考虑进去。

即:外层循环从1到N,用于遍历N个物品,内层循环从0(我们暂且认为没有容量小于0的物品)到V

即浏览到Ni时,任意一个容量值j的最优价值都计算出来

计算的公式为:当前容量值j如果大于Vi,那么有两种选择——选该物品i,那么当前容量j的价值就变成了j-Vi的最优价值+i的价值,或者是不选择该物品,保留j的价值

即  f(i,j)=max{f(i-1,Pj),f(i-1,P[j-v[i]]+Pi

可能有一些绕,举个例子说明:还是上面的数据,假设我们考虑到C:

那么 对于我每一个容量点(0~100)都要进行是否去物品C的判断,比如说容量50,很明显,装不下,比如说容量90,我要看在我不选物品C之前,我容量80时最大的

价值是多少,如果我选择这个物品C,那么我的价值就是 容量为:90-65=25时我能获取的价值 再加上物品C本身的价值。

不加C时容量90的价值为A+B=20k ,加C为容量25(没有合适的物品,价值为0)+C的价值=0+19=19k,很显然,选择C是一种不合适的行为。

也就是我们的代码为:

for(i=1;i<=n;i++)    //外层循环物品个数
    {
        for(j=0;j<=v;j++) //内层循环每个容量点
        {
            if(j-b[i]>=0)
            dp[i][j]=fmax(dp[i-1][j],dp[i-1][j-b[i]]+a[i]);    //容量大于该物品体积时状态转移方程
            else 
    dp[i][j]=dp[i-1][j];          //容量小于该物品体积,只能舍弃

}
  }

想必到此大家应该明白01背包的解决思路了,下面为hdu一道01背包题

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2602

题目描述:和01背包基本意思一样, 收集骨头

#include<stdio.h>int dp[1020][1020];
int fmax(int a,int b)
{return a>b?a:b;
}
int main()
{int b[1020];int a[1020];int t,n,i,j,v;scanf("%d",&t);while(t--){ scanf("%d%d",&n,&v);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++)scanf("%d",&b[i]);for(i=1;i<=n;i++){for(j=0;j<=v;j++){if(j-b[i]>=0)dp[i][j]=fmax(dp[i-1][j],dp[i-1][j-b[i]]+a[i]);else dp[i][j]=dp[i-1][j];}}printf("%d\n",dp[n][v]);
}
return 0;
}

背包——01背包Bone Collector(hdu2602)相关推荐

  1. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  2. 动态规划(Dynamic Programing)背包——01背包

    引用大佬 问题描述 有N件物品和容量为W的背包.第i件物品的重量为w[i],得到的价值是value[i],每件物品只能用一次. 求解:将哪些物品装入背包里物品总价值最大? 1.确定状态 定义一个数组, ...

  3. python调用cplex求解装箱问题_使用cplex(python)解决限制背包(01背包)问题

    问题描述: 对于01背包问题,简历数学模型,使用python的cplex模块解决问题,找到最大解. 代码实现: # -*- coding: utf-8 -*- # The MIP problem so ...

  4. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  5. 【恋上数据结构】贪心(最优装载、零钱兑换、0-1背包)、分治(最大连续子序列和、大数乘法)

    贪心.分治 贪心(Greedy) 问题1:最优装载(加勒比海盗) 问题2:零钱兑换 零钱兑换的另一个例子 贪心注意点 问题3:0-1背包 0-1 背包 - 实例 一些习题 分治(Divide And ...

  6. 动态规划_背包问题(01背包 完全背包)

    背包问题-多种物品 重量不同 价值不同. 你可以取最多重量不超过W的物品,问最大价值为多少? 01背包 01背包 指的是 有N个物品 每个物品的重量为W[ i ],价值为V[ i ],(每个物品只有一 ...

  7. 背包问题——01背包

    背包问题--01背包 01背包作为动态规划(dynamic programing)中最基础的问题,需要我们彻底理解其中的原理,为以后解决更难的动态规划问题打下良好的基础. 这里拟定一个01背包问题: ...

  8. 01背包与完全背包的区分

    区别: 01背包同个物品只能选1个,完全背包同个物品可以选大于等于0个. 01背包优化版的 j 从 m->v[i] 会只使用一次 v[i] ,而完全背包优化版的 j 从 v[i] -> m ...

  9. 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包

    动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...

最新文章

  1. EBS form日历可选范围设置(calendar.setup )介绍
  2. CSS布局基础之二认识Viewport
  3. COJ 2192: Wells弹键盘 (dp)
  4. [LeetCode] 303. Range Sum Query - Immutable
  5. excel 案例素材_Excel用了十年,函数千千万,最牛的还是vlookup
  6. PHP 学习总结之变量
  7. Java 基础 - 面向对象(不错N多教程集合)
  8. 双重for_测试双重图案
  9. 设计一个安全对外的API接口,需要考虑哪些方面?
  10. 【转】5G EN-DC/NE-DC/NGEN-DC构架
  11. python 词云_python词云-数据产品岗位描述的词云
  12. struts2第一个程序 Helloworld
  13. 怎么用php myadmin连接远程MYSQL数据库
  14. 使用ffmpeg根据开始和结束时间剪切视频
  15. Linux 网络编程基础(一) ---------------客户端/服务器的简单实现
  16. c语言程序设计辅导资料pdf,C语言程序设计辅导资料(修订版).pdf
  17. 从认知盈余说起,也谈分享精神
  18. 机器视觉核心之工业相机
  19. Hadoop上路-03_Hadoop JavaAPI
  20. php 文件内容追加,PHP 文件写入或追加数据

热门文章

  1. python绘制动态心形_python绘制动态爱心
  2. java考试填空题_Java常用考试(填空题)
  3. c mysql 异步查询_C#Mysql – 使用锁在数据库上查询异步等待服务器
  4. C++:不同数据类型作为参数传递和作为返回值的例子
  5. linux内核那些事之E820
  6. StringUtils详细介绍
  7. [Unity] 战斗系统学习 11:Buff 框架 1
  8. ie浏览器在线使用_微软加速反IE战略,超过1000个网站将拒绝渲染
  9. cmd命令 - vue项目:单独安装vue-router
  10. python 风玫瑰图_python之windrose风向玫瑰图的用法