不好意思标题可能没法表达清楚,具体问题是这样的:
假设我们有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 )
------解决思路----------------------
其实如果不追求最优解,只要求误差小于某个范围
可以先使用贪婪算法,快速得到一个比较接近最优解的解,然后再通过替换其中的某些选项来调整总长度