背包问题解析
2013-01-02 00:33
148 查看
今天看到算法:C语言实现这本书 第五章递归与树 中 背包问题,想到对这个问题理解不够透彻. 希望利用第一篇技术博客好好的吃透它.
背包问题是什么?
设有i类不同大小和价值的物品,背包的可用容积为cap,进行合理的物品选择使得所装入的物品价值最大.
背包问题解法?
设定:背包大小为cap,对应第i项物品记为item[i],
定义结构体:
typedef struct
{ int size;
int val;
}item;
思路:利用递归解法,每次我们选择一个项,我们都假设可以递归的找到打包剩余背包的最优方式. 对于大小为cap的背包,对于可用类型中任何一项i,我们可以把i放入背包的同时,使得其他项有最优打包,来得到一种最优解.简单地说最优打包的方式就是已经找到(或将要找到)大小为capp-item[i].size的更小背包.这种解法利用了最优决策原理.
递归实现 大量的重复计算
int knap(int cap)
{ int i,space,max,t;
for(i=0,max=0;i<N;i++)
if((space = cap - items[i].size)>=0)
if((t = knap(space) + items[i].val) > max)
max = t;
return max;
}
代码分析:蓝色标记的是程序的关键,对于背包问题,进行如上所说思路递归,对于空间和时间的双重把控是关键。递归遍历每一种存在的可能,再一次和max比较,众所周知 会有大量重复的出现,一般程序设计中不考虑。
动态规划实现 递归升级版 检索已保存的值 使用一个观察哨来表达未知值而不是进行递归调用.
int knap(int M)
{int i,space,max,maxi,t;
if(maxknown[M] != unknown) return maxknown[M];
for(i=0,max=0;i<N;i++)
if((t = knap(space) + items[i].val) > max)
{ max = t ; maxi = i;}
maxKnown[M] = max; itemKnown[M] = items[maxi];
return max;
}
代码分析:存储项的索引,以便能够在计算之后重建背包的内容,如果希望itemKnown[M]在背包中,那么余下的内容就跟大小为M-itemKnown[M].size的最优背包内容一致,因此,itemKnown[M-item[M].szie]在背包里,以此类推。
动态规划继续思考中...
背包问题是什么?
设有i类不同大小和价值的物品,背包的可用容积为cap,进行合理的物品选择使得所装入的物品价值最大.
背包问题解法?
设定:背包大小为cap,对应第i项物品记为item[i],
定义结构体:
typedef struct
{ int size;
int val;
}item;
思路:利用递归解法,每次我们选择一个项,我们都假设可以递归的找到打包剩余背包的最优方式. 对于大小为cap的背包,对于可用类型中任何一项i,我们可以把i放入背包的同时,使得其他项有最优打包,来得到一种最优解.简单地说最优打包的方式就是已经找到(或将要找到)大小为capp-item[i].size的更小背包.这种解法利用了最优决策原理.
递归实现 大量的重复计算
int knap(int cap)
{ int i,space,max,t;
for(i=0,max=0;i<N;i++)
if((space = cap - items[i].size)>=0)
if((t = knap(space) + items[i].val) > max)
max = t;
return max;
}
代码分析:蓝色标记的是程序的关键,对于背包问题,进行如上所说思路递归,对于空间和时间的双重把控是关键。递归遍历每一种存在的可能,再一次和max比较,众所周知 会有大量重复的出现,一般程序设计中不考虑。
动态规划实现 递归升级版 检索已保存的值 使用一个观察哨来表达未知值而不是进行递归调用.
int knap(int M)
{int i,space,max,maxi,t;
if(maxknown[M] != unknown) return maxknown[M];
for(i=0,max=0;i<N;i++)
if((t = knap(space) + items[i].val) > max)
{ max = t ; maxi = i;}
maxKnown[M] = max; itemKnown[M] = items[maxi];
return max;
}
代码分析:存储项的索引,以便能够在计算之后重建背包的内容,如果希望itemKnown[M]在背包中,那么余下的内容就跟大小为M-itemKnown[M].size的最优背包内容一致,因此,itemKnown[M-item[M].szie]在背包里,以此类推。
动态规划继续思考中...
相关文章推荐
- 背包问题解析
- 背包问题--贪心算法C#Demo解析
- 背包问题深度解析
- SDUN上部分背包问题及解析
- 背包问题解析
- 总结——背包问题解析及模板代码
- 0-1背包问题--动态规划C#Demo解析
- 背包问题——解析
- Java实现0-1背包问题
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 动态规划 0-1背包问题
- 简单背包问题(实际上是子集问题)
- http://acm.hdu.edu.cn/showproblem.php?pid=1203(背包问题)
- 较难处理的背包问题+无后效性的深入理解(09年多校)(3008)
- 解决使用枚举串口类而造成无法无法解析的外部符号的问题
- 0-1背包问题
- (转载)动态规划之背包问题(一)
- 小班讲课之动态规划基础背包问题
- linux基础——经典线程同步问题解析及编程实现
- 背包问题(递归算法)