博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
背包问题
阅读量:7095 次
发布时间:2019-06-28

本文共 952 字,大约阅读时间需要 3 分钟。

01背包问题:每件物品只有一件,可以选择放或不放(即取0件或1件,故名01)

代码很短:

1、最多能创造多少价值?

初始化:

for(int v=0;v<=V;++v) d[v]=0;

代码:

for(int i = 0; i < N; i++)for(int v = c[i] ; v < V; v++) d[i][v] = max{d[i-1][v], d[i-1][v-c[i]]+w[i]};

优化空间后的如下:

for(int i = 0; i < N; i++)for(int v = V ; v >=c[i]; v--) d[v] = max{d[v], d[v-c[i]]+w[i]};

2、背包放满时,最多(最少)能创造多少价值?

这个问题的前提是背包必须要放满,所以我们的初始条件要改变,原来我们可以一件东西都不放,这是最大的价值是0,但在这个问题下是不允许的

所以只有在容量为0时最大价值为零,即d[0] = 0,将其他设为-∞,这样循环下来只有当包的容量恰好填满的时候d[v]才有值。

初始化:

d[0]=0;for(int v=1;v<=V;++v) d[v]=-∞;

其他不变:

for(int i = 0; i < N; i++)for(int v = V ; v >=c[i]; v--) d[v] = max{d[v], d[v-c[i]]+w[i]};

3、背包放满时,总共有多少种方案?

 

完全背包问题:完全背包中,每件物品可以放无穷件。

一些优化:

1.若两件物品i、j满 足Ci ≤ Cj且Wi ≥ Wj,则将可以将物品j直接去掉,不用考虑。 的O(N2)

2.首先将费用大于V 的物品去掉,然后使 用类似计数排序的做法,计算出费用相同的物品中价值最高的是哪个,可 以O(V + N)地完成这个优化O(V + N)

主要代码:

内层循环恢复正序,这样更新d[v]的时候就可以算上多次加入自己的情况

for(int i=1;i<=N;++i)    for(int v=Ci;v<=V;++v) d[v]=max(d[v],d[v-Ci]+Wi);

多重背包问题

 

转载于:https://www.cnblogs.com/Lune-Qiu/p/8963646.html

你可能感兴趣的文章
Android编程之常识 - 混淆
查看>>
源码分析六(org.springframework.util包之Assert类)
查看>>
源码分析八(org.springframework.util包之StringUtils类))
查看>>
#include<> 和 #include""的区别
查看>>
【转】最近很火的 Safe Area 到底是什么
查看>>
java EE 环境配置(JDK + Tomcat + Eclipse for java EE)
查看>>
【转】【Python】Python正则表达式使用指导
查看>>
c#去掉guid中间的横杆
查看>>
Java架构-(十二) 整合spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)
查看>>
ReactNative干货分享——视频播放器App
查看>>
详解 PHP 数组的底层实现:HashTable
查看>>
函数式点滴--partial&curry
查看>>
wokerman启动分析
查看>>
PHP数组排序算法实现(14种)
查看>>
CSS3总结系列0
查看>>
centos6.5和centos7如何搭建php环境
查看>>
Android ImageLoader 实现
查看>>
Swift Notes 0x00 前言
查看>>
[Violent Python for Hackers]常用工具收集整理
查看>>
一个后端的前端学习之旅——2.先搞定gulp
查看>>