当前位置: 代码迷 >> C# >> [算法] 怎么实现选取若干不同长度的物体连接成固定长度
  详细解决方案

[算法] 怎么实现选取若干不同长度的物体连接成固定长度

热度:620   发布时间:2016-05-05 04:43:37.0
[算法求助] 如何实现选取若干不同长度的物体连接成固定长度?
不好意思标题可能没法表达清楚,具体问题是这样的:
假设我们有1.1m,2.2m,3.4m长度的三种木棍各若干根,需要把它连接起来组成10m长的长条木棍,有什么思路呢?
如果将问题扩展开就是说有已知存在若干根长度不同的木棍,如何选择每种的数量来组成要求的长度?
也许不存在解,也有可能存在多个解,如果不存在解的时候又分为两种需求,1是尽量靠近目标但不超过;另外一种是超过目标但是超过距离尽量小。
求各位大大解答谢谢拉
------解决思路----------------------
关键字:深度优先搜索,动态规划

方法一:
木棍较少时小数据建议使用深度优先搜索。木棍数量较多时,时间会很长

方法二:
木棍较多,而长度较少时,建议使用动态规划。

设有n个木棍我们要组成的长度为m,木棍长度不超过r
 f [ i , j ] 表示长度为用前i个木棍能否组成长度为j的物体
g[ i ] 表示第i个木柜的长度

我们可以得出表达式
f [ i , j  ] =  f [ i - 1, j - g[i] ] 
边界条件 f [  ] 

最终答案为 f[ n , k ] 其中 
------解决思路----------------------
k-m
------解决思路----------------------
 最小
这个算法的时间复杂度为 o( r * n )

由于 f [ i  ]的状态只与 f [ i-1 ] 有关,可使用滚动数组优化表达式得出
f [ j ] = f[ j - g[i]]
得算法的空间复杂度为 o ( r )

方法三:如果不追求最优解使用贪心算法,可从大到小排序相加,取最接近的值 。 时间复杂度 o( n )
------解决思路----------------------
其实如果不追求最优解,只要求误差小于某个范围
可以先使用贪婪算法,快速得到一个比较接近最优解的解,然后再通过替换其中的某些选项来调整总长度
  相关解决方案