01背包问题超详细个人版_第1页
01背包问题超详细个人版_第2页
01背包问题超详细个人版_第3页
01背包问题超详细个人版_第4页
01背包问题超详细个人版_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目有N件物品和一个容量为V的背包。第i件物品的体积是ci,价值是wi。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即fiv表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:fiv=maxfi-1v,fi-1v-ci+wi这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为fi-1v;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-ci的背包中”,此时能获得的最大价值就是fi-1v-ci再加上通过放入第i件物品获得的价值wi。这时候我们可以用二维数组进行做了/二维数组实现背包#include#include#define N 1002int maxNN;int main() int jiazhiN,tijiN,t,i,j,n,v; scanf(%d,&t); while(t-) scanf(%d%d,&n,&v); for(i=1;i=n;i+) scanf(%d,&jiazhii); for(i=1;i=n;i+) scanf(%d,&tijii); memset(max,0,sizeof(max); for(i=1;i=n;i+) for(j=0;j=v;j+) if(tijii=j&maxi-1j价值大小12345678910212222222222放第一个物品122233333333放第二个532233388888442233388881235可以看出 fv=maxfv,fv-ci+wi;V是从大到小的 其中的fv,fv-ci是前面的值 比较的结果赋值给fv比如说当i=5的时候 fvfv-5注意两者都是i=4时候的值得出的结果12 赋值到新的fv 但是此时的fv是i=5的当把最后一行改写成55 6的时候 我们可以看出 fv-6=f4+55 大于fv 所以我们可以得出新的fv=f4+55这样结果就是取的体积为1 2 6 代码如下/一维数组实现背包问题#include #include #define N 1002int main() int dpN,volN,valN; int t,n,i,j,v; scanf(%d,&t); while(t-) scanf(%d%d,&n,&v); for(i=1;i=n;i+) scanf(%d,&vali); for(i=1;i=n;i+) scanf(%d,&voli); memset(dp,0,sizeof(dp); for(i=1;i=voli;j-) if(dpjdpj-voli+vali) dpj=dpj-voli+vali; printf(%dn,dpv); return 0;初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。如果是第一种问法,要求恰好装满背包,那么在初始化时除了f0为0其它f1.V均设为-,这样就可以保证最终得到的fN是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f0.V全部设为0。为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-了。如果背包并非必须被装满,那么任何容量的背包都

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论