首页 > 其他分享 >01背包问题

01背包问题

时间:2023-05-31 17:33:48浏览次数:34  
标签:初始化 01 int 装满 恰好 问题 背包 dp


问题描述:

 

给定n种物品和一背包的容量m,物品i的重量是c[i],其价值是w[i],问如何选择装入背包中的物品总价值最大?每种物品一

件,可以选择放或不放。

 

 

分析:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

 

01背包问题_未定义

 

这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。

 

恰好装满背包与不要求恰好装满背包的区别。这两种区别就是初始化的时候有所不同。

 

如果是第一种问法,要求恰好装满背包,那么在初始化时除了dp[1]为0外其它dp[2..V]均设为-INF,这样就可以保证最终得

到的dp[V]是一种恰好装满背包的最优解。

 

如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将dp[1..V]全部设为0。

 

可以这样理解:初始化的dp数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只

有容量为0的背包可能被重量为0的nothing恰好装满,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应

该是-INF了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个值为0,所以初始时状态的

值也就全部为0了。

 

int Work(int c[],int w[],int n,int m)
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        for(int v=1;v<=m;v++)
        {
            if(v >= c[i]) dp[i][v] = max(dp[i-1][v],dp[i-1][v-c[i]] + w[i]);
            else dp[i][v] = dp[i-1][v];
        }
    }
    return dp[n][m];
}

 

空间的优化,要对V逆着推,这样才能保证推dp[v]时dp[v-c[i]]保存的是状态dp[i-1][v-c[i]]的值。

 


int Work(int c[],int w[],int n,int m)
{
    memset(dp,0,sizeof(dp));
    for(int i=1; i<=n; i++)
        for(int v=m; v >= c[i]; v--)
            dp[v] = max(dp[v],dp[v-c[i]] + w[i]);
    return dp[m];
}

 

标签:初始化,01,int,装满,恰好,问题,背包,dp
From: https://blog.51cto.com/u_16146153/6388672

相关文章

  • POJ1228(稳定凸包问题)
    题目:Grandpa'sEstate题意:输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。分析:容易知道,当一个凸包稳定时,凸包的每条边上都要有至少三个......
  • 打开扫面共享问题
     症状表现为通过网络共享那些设置完之后,还是无法访问其它电脑共享的文件夹或者打印机,提示无法访问。即使你通过网络也能发现到对方,但就是连不上。解决办法:1、按win+R打开运行,输入“regedit”,打开注册表编辑器。 2、打开计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentCont......
  • webpack打包后图片资源无法加载问题
    前言图片在本地开发可以显示,但是打包部署后图片无法加载修改webpack.config.js配置将生成环境的publicPath的路径改为"./"   判断是开发环境还是生成环境在package.json中通过 cross-envNODE_ENV=production设置环境变量 通过 process.env.NODE_ENV访问环境变量......
  • Snap算法学习01-02关于net节点、边、权值、标签的读写操作——netinf中cascades层级信
      Model可选值—— 0:exponential,  1:powerlaw,  2:rayleigh"                                      ......
  • git 使用ssh连接Github:017
    1.首先打开GitBash终端,生成私钥和公钥:ssh-kengen第一步提示:生成的密钥你要放在哪里?这里有给出默认地址,当然你也可以自己设置一个地址,如果不设置,直接回车就行 第二步提示:你要不要给你当前的密钥去设置一个密码?其实这一步没必要去设置,回车就行 第三步提示:提示你输入确认......
  • 解决 pyinstaller 出现的不能打包的问题
      错误详情:OSError:Pythonlibrarynotfound:libpython3.7m.so,libpython3.7.so.1.0,libpython3.7m.so.1.0,libpython3.7.so,libpython3.7mu.so.1.0ThismeansyourPythoninstallationdoesnotcomewithpropersharedlibraryfiles.Thisusuallyhappensdu......
  • TF无法识别问题分析
    新做的板子发现TF插上之后有些板子系统无法识别到TF卡。后对不良板子和好板子进行分析:发现问题: 原理图1、发现插上TF卡后DET管脚会和TF卡座外壳地连接到一起。正常板子DET管脚会拉到0V左右,卡能识别。而不良......
  • MS SQL Server 可能会遇到一些瓶颈问题,具体如下:
    MSSQLServer可能会遇到一些瓶颈问题,具体如下:CPU瓶颈:一个拥有高并发交易的大规模系统往往需要处理大量的数据请求。当系统负载较高时,处理器可能会成为瓶颈,导致应用程序性能下降。内存瓶颈:MSSQLServer在处理大量数据时需要使用内存,如果系统中内存不足,则可能会导致性能......
  • 一个由于不同微服务框架混搭导致BeanPostProcessors处理bean异常导致的问题
        前天到昨天晚上,某开发报告了一个问题,我们的一个应用程序接入了腾讯的TSF微服务框架后,使用feign访问接口,会导致token丢失,无法解决。    大体介绍下项目情况,我们的应用使用了某第三方微服务框架,不是源生的springcloud或springcloudalibaba框架,第三方厂家基于s......
  • git 远端分支管理、仓库迁移:017
    1.在Github上创建分支: 2.在Github上删除分支:  3.使用命令来删除远端分支:如果远端分支发生改变,需要通过gitpull来获取远端最新分支,如下图,就可以看到获取到了最新分支: 查看本地分支和远端分支:gitbranch-a 本地无法切换远端分支,但是我们可以通过命令:check......