没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
总结
总结
(下面的方程就按 一种算法理解)
(下面的方程就按 一种算法理解)
昨天我讲的
昨天我讲的
DP
DP
都是直接写出方程了,因为那些的思路相似,相当于套
都是直接写出方程了,因为那些的思路相似,相当于套
用公式,今天主要讲关于
用公式,今天主要讲关于
背包的各种问题的思路
背包的各种问题的思路
。在讲之前,我补充了
。在讲之前,我补充了
本应该是昨天讲的一维和二维最大字段和,还补充了简单
本应该是昨天讲的一维和二维最大字段和,还补充了简单
DP
DP
的路径求
的路径求
法。然后,我举了个数塔的例子。先让你们知道
法。然后,我举了个数塔的例子。先让你们知道
怎么用递推的方法写出
怎么用递推的方法写出
一维数组的方程
一维数组的方程
,在这过程中,我们发现那个
,在这过程中,我们发现那个
循环必须从大到小去写
循环必须从大到小去写
,
,
如果从小到大的话,
如果从小到大的话,
会重复计算一些值(这个性质很重要哦)
会重复计算一些值(这个性质很重要哦)
。然后我
。然后我
们来到
们来到
0/1
0/1
背包问题,写出去一维数组的方程,为了让你们更深一步的
背包问题,写出去一维数组的方程,为了让你们更深一步的
理解这个方程的原理,我举了个例子,画出两张表,表
理解这个方程的原理,我举了个例子,画出两张表,表
1
1
是
是
V——0
V——0
,
,
表
表
2
2
是
是
0———V
0———V
;
;
通过观察,我们发现表
通过观察,我们发现表
2
2
其实就是一个物品可以无
其实就是一个物品可以无
限取的方程的表
限取的方程的表
,也就是说,
,也就是说,
如果方程是
如果方程是
0——V
0——V
,那么这个方程就是
,那么这个方程就是
关于每个物体无限取的问题,
关于每个物体无限取的问题,
即
即
完全背包的
完全背包的
O(VN)
O(VN)
算法。
算法。
然后我有讲了
然后我有讲了
我完全背包的其他算法,主要是
我完全背包的其他算法,主要是
二进制
二进制
0/1
0/1
算法
算法
。接下来是多重背包的
。接下来是多重背包的
不错的算法,分类:
不错的算法,分类:
1
1
。转化成完全背包
。转化成完全背包
O
O
(
(
VN
VN
)算法,
)算法,
2
2
,转化成
,转化成
2
2
进制
进制
0/1
0/1
算法。至于最优算法难度较大,没讲。之后的问题都可以分
算法。至于最优算法难度较大,没讲。之后的问题都可以分
类转化成上面的各类问题,所以我大概提了一下,自己好好理解吧
类转化成上面的各类问题,所以我大概提了一下,自己好好理解吧
……
……
最大子段和
最大子段和
(好像没这个题,不过有
(好像没这个题,不过有
2479
2479
和
和
259
259
3
3
)
)
Given a set of n integers: A={a1, a2,..., an},
Given a set of n integers: A={a1, a2,..., an},
we define a function d(A) as below:
we define a function d(A) as below:
D(A)=max(sum(i,j))(n>j>=i>=0);
D(A)=max(sum(i,j))(n>j>=i>=0);
状态定义:设
状态定义:设
Maxsub (k)
Maxsub (k)
表示以
表示以
ak
ak
做为“终
做为“终
点”的最大子段和。
点”的最大子段和。
状态转移方程:
状态转移方程:
Maxsub (k) = Max
Maxsub (k) = Max
{Maxsub(k-1),0}+ak (n>k>1)
{Maxsub(k-1),0}+ak (n>k>1)
;
;
Maxsub
Maxsub
(1) = a1
(1) = a1
。
。
int sum=0, b=0;
int sum=0, b=0;
for(int i=0; i<n; i++)
for(int i=0; i<n; i++)
{
{
b+=c[i];
b+=c[i];
if(b<0)b=0;
if(b<0)b=0;
if(b>sum) sum=b;
if(b>sum) sum=b;
}
}
、算法改进
、算法改进
int maxsum(int n, int *c)
int maxsum(int n, int *c)
{
{
int sum=-99999, b=0;
int sum=-99999, b=0;
for(int i=0; i<n; i++)
for(int i=0; i<n; i++)
{
{
if(b>0) b+=c[i];
if(b>0) b+=c[i];
else b=c[i];
else b=c[i];
if(b>sum) sum=b;
if(b>sum) sum=b;
}
}
return sum;
return sum;
}
}
(二维)
(二维)
To the Max
To the Max
(
(
1050
1050
)
)
0 -2 -7 0
0 -2 -7 0
9 2 -6 2
9 2 -6 2
-4 1 -4 1
-4 1 -4 1
-1 8 0 -2
-1 8 0 -2
max 9 2
max 9 2
-4 1
-4 1
-1 8
-1 8
剩余52页未读,继续阅读
资源评论
- tester20092012-12-29最近在研究多背包问题,资料对我很有帮助!
- honey_fansy2013-03-08谢谢了,不错
q804345178
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功