• 大佬整理的理解链接:(建议先看一遍自行理解DP思想再去看代码)

动态规划之01背包问题 - kkbill - 博客园01背包问题 问题描述: 给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总https://www.cnblogs.com/kkbill/p/12081172.html

  • 思路

DP算法核心思想: 过利用已有的子问题信息高效求出当前问题的最优解。

f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少。
    result=max(f[n][0~v]) 
    
    f[i][j]:
    (1)、不选第i个物品,f[i][j]=f[i-1][j];
    理解:不选第i个物品有两种情况:
        a. 体积不够
        b. 不是最优解,即f[i-1][j]为优解
   ( 2)、选择第i个物品,f[i][j]=f[i-1][j-v[i]]+w[i]
    理解:这里用到了以前已经解决了的子问题,即f[i-1][j-v[i]]的最优解 
    
    eg:新加的物品体积为2,价值为4,假设体积够装,则f[i][j]=max(f[i-1][j-2]+4,f[i-1][j]) 
        如果体积不够装,则f[i][j]=f[i-1][j] 
        
    f[j]:
    状态转移方程为:f[j] = max(f[j], f[j - v[i]] + w[i]) 。(我在题目中用f1[N]来表示优化后的一维数组)

需要注意的是,一维版本需要逆序求最大值,即从j=m开始,防止数据被覆盖污染

代码:

#include<iostream>
#include<algorithm>
using namespace std;const int N=1010;int n,m;
int f[N][N];    //i个物品在总体积小于等于j的情况下可以获得的最大价值
int v[N],w[N];  //分别表示第i个物品的体积和价值
int f1[N];      //优化的一维版数组 //二维版
int main()
{cin>>n>>m; //背包里有n个东西,能装的物品的体积总和不超过mfor(int i=1;i<=n;i++) cin>>v[i]>>w[i]; //全局变量初始值默认为0,此步骤可省略for(int i=1;i<=n;i++)for(int j=0;j<=m;j++){//不选择第i个物品f[i][j]=f[i-1][j];//选择第i个物品if(j>=v[i]) //当前背包的体积可以装下第i个物品{f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);} } //f[n][m]即为最大值  cout<<f[n][m];} //优化--一维版
int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++)for(int j=m;j>=v[i];j--)f1[j]=max(f1[j],f1[j-v[i]]+w[i]);cout<<f1[m];return 0;
}

动态规划-01背包问题相关推荐

  1. 动态规划—01背包问题

    原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...

  2. 动态规划——0-1背包问题

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...

  3. 动态规划——01背包问题 看此一篇文章就够了

    本文讲述经典算法--动态规划的 常见问题 01背包  一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...

  4. 动态规划---01背包问题(2种方法)

    一.动态规划 代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法 本质:递推,核心是找到状态转移的方式,写出dp方程. 解决问题:交叉,重叠子问题(最优子问题) 形式 ...

  5. 动态规划01背包问题入门学习,详细笔记,推荐阅读

    问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...

  6. python实现动态规划0-1背包问题

    一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...

  7. 详解动态规划01背包问题--JavaScript实现

    对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...

  8. 动态规划--01背包问题详解

    代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...

  9. 1.动态规划--01背包问题

    动态规划 DP问题思考时候分成两大部分考虑 1. 状态表示 f(i,j) (1) 集合:(所有选法的集合) 所有选法 条件: 1.从前i个物品中选 2. 总体积m<=j (2) 属性 最大值.最 ...

最新文章

  1. PNG透明兼容IE6的几种方法
  2. 运算放大器在超高频信号作用下的偏移量的变化
  3. 渣男劈腿,两个女生逼他做出选择,结果......
  4. 传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)
  5. dataframe scala 修改值_【Spark学习笔记】 Scala DataFrame操作大全
  6. 了解SQL Server事务日志备份和完整备份的日志序列号
  7. 面对亚马逊和谷歌的争夺战,小企业该如何生存?
  8. Mac怎么合并文件夹
  9. Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
  10. CCS历代版本下载地址以及6.0以上版本添加软件仿真
  11. html js实现省市区联动调节下拉框菜单
  12. Discriminative Reasoning for Document-level Relation Extraction
  13. 怎么制作出一张证件照?分享几种好用的证件照制作方法
  14. 每日新闻:华为获首个微模块产品PUE测试证书;Linux发布Acumos AI开源架构平台;商汤技联手华侨城中学打造智能实验学校...
  15. 互联网音乐告别版权战,音乐社区或成新风口?
  16. 力天创见热区统计方案
  17. python-字符串补录
  18. muscle多序列比对简单应用
  19. 《程序原本-追溯程序原本之书》读书笔记
  20. springboot整合druid 监控sql

热门文章

  1. 有趣的物联网项目合集
  2. 平方和:在1-40中只要数字中含有2,0,1,9的数字一共有28个,他们的和是574,平方和是14362。请问1-2019中,所有这样的输的平方和是多少?
  3. ICP许可证申请误区一:我是创业型小公司,开发了一款APP,需不需要申请ICP许可证,该怎么办?
  4. 2023首届大学生算法大赛 - 拿饼干
  5. 计算机项目uniapp(毕设课设)之含文档+PPT+源码等]精品Uniapp+SSM的家庭客栈管理系统|酒店餐饮住宿订餐点餐
  6. Excel插件E灵:按家庭建表,创建一户一表。将明细表转成一户一表
  7. php判断中文字符长度,JavaScript_JS判断字符串长度的5个方法(区分中文和英文),目的:计算字符串长度(英文占 - phpStudy...
  8. Yale N. Patt教授的《计算机系统概论》
  9. 推荐5款免费的高清壁纸
  10. Visio 画甘特图