Spiga

帮一个朋友征集算法代码,大家都来开动你的脑袋发挥你的智慧参与吧

2011-06-22 13:49 by 魏琼东, 2534 visits, 收藏, 编辑

刚有一个朋友问一个算法问题,问题如下:

        有一堆木棒长度在 1m - 21m之间(长度为整数),用户拥有的木棒长度也是用户自定义,的数量用户自定义
其中的一组样例数据是10m 的木棒 300跟, 14m 的木棒223跟, 18m 的木棒412跟, 2米的木棒301跟, 5米的木棒 48跟
我要求的是,这些木棒可以组成多少个 21米长的木棒?(木棒不可以切割,只可以拼接)。

 

这是一个典型的算法问题,类似在当年的C语言版本的数据结构与算法中的那个有100RMB买多少只公鸡、母鸡、小鸡的问题(各自价格不一),试问有多少种解法。

 

此类问题最简答的解法是穷举法,大家可以来试着写出其C#、java、c、php的算法,也可以开动脑袋用其他的算法进行解决,期待大家的参与,谢谢。


作者:魏琼东
出处:http://www.cnblogs.com/eastjade
关于作者:近10年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作。如有问题或建议,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群116773358、15118502(已满)和大家共同讨论,非常感谢。

Add your comment

24 条回复

  1. #1楼 废墟中的垃圾      2011-06-22 14:00
    第一步猜测:
    因为跟数m,和跟数对应的数量n都是一个不确定数,所以可能的情况是 (m × n)的21 * 500 次方(这个结论可能是错误的)
    所以首先可以先进行排除,也就是某些木棒无论怎么组合都不可能成为21.
     回复 引用 查看   
  2. #2楼[楼主] 魏琼东      2011-06-22 14:05
    @废墟中的垃圾
    楼上的试试写一个算法出来,完整的
     回复 引用 查看   
  3. #3楼 IORY      2011-06-22 14:20
    48个,21是奇数,棍子长度只有5是奇数.21=5+14+2
     回复 引用 查看   
  4. #4楼 废墟中的垃圾      2011-06-22 14:23
    @IORY
    楼上的,我的这个只是样例数据,需要的是完整的算法。
     回复 引用 查看   
  5. #5楼 icjyw.com      2011-06-22 14:28
    坐看牛人解答
     回复 引用 查看   
  6. #6楼 废墟中的垃圾      2011-06-22 14:29
    @icjyw.com
    不过你说的一句话的确非常好,因为21是基数,所以可以优先减枝,减去只有偶数组合的可能
     回复 引用 查看   
  7. #7楼 Eric·liu      2011-06-22 14:51
    引用IORY:48个,21是奇数,棍子长度只有5是奇数.21=5+14+2

    补充: 3个5m 3个2m
    3*5 + 3*2 = 15 + 6 = 21
    研究中...有意思!
     回复 引用 查看   
  8. #8楼 lijavasy      2011-06-22 14:51
    LZ应该附上您的解法,也好让大家学习学习。
     回复 引用 查看   
  9. #9楼 fantiny      2011-06-22 14:57
    楼主去看看贪婪算法
     回复 引用 查看   
  10. #10楼 废墟中的垃圾      2011-06-22 14:58
    @fantiny
    恩 贪婪可以,基因也可以,追溯也可以,问题是具体的解法。希望参与进来进行算法的解析
     回复 引用 查看   
  11. #11楼 C#.NET通用权限管理系统组件      2011-06-22 15:37
    用户自定义,的数量用户自定义?

    没能看懂。
     回复 引用 查看   
  12. #12楼 废墟中的垃圾      2011-06-22 15:42
    @C#.NET通用权限管理系统组件
    用户拥有的木棒长度是用户自定义,木棒的数量用户自定义
     回复 引用 查看   
  13. #13楼 张亚      2011-06-22 15:44
    算法有问题,暂时删除
     回复 引用 查看   
  14. #14楼 张亚      2011-06-22 15:45
    算法有问题,暂时删除
     回复 引用 查看   
  15. #15楼 左洸      2011-06-22 15:53
    贪心法或者爬山法一般情况下找不到最优解,建议楼主用模拟退火、禁忌搜索、或者遗传算法。

    1、将所有棒子编号,并随机排序,组成序列

    2、设置一个位置指针 pos = 0,指向序列中的第一个位置

    开始循环,直到位置指针 pos 大于 序列长度

    以下为循环体=================》》》》》》

    3、设置有效组合(即发现了多少个21米)的个数 count = 0

    4、设置累加值 sum = 0

    5、将位置指针 pos 处的棒子长度与 sum 相加,得到新的累加值
    sum = sum + length(pos)

    6、位置指针向后移动一位pos++

    7、判断:
    if(sum<21) 回到步骤 5
    if(sum==21) {
    记录组成 21 米的这几个棒子的编号;
    count++;
    回到步骤 4
    }
    if(sum>21) 回到步骤 4

    以上为循环体=================》》》》》》

    8、用模拟退火、禁忌搜索或者遗传算法的法则,判断是否接受上面处理的这个序列为当前序列,(如果不接受就继续用旧的作为当前序列)

    9、从当前序列变换出一个(或一组)新的序列(邻域)

    10、回到步骤 2


    退出机制:长时间没有发现更好的序列(找不到更大的 count),则最大 count 对应的那个序列就是最有解


    重点在步骤 8 : 他有可能接受差解作为当前解,这样就可以脱离局部最优
     回复 引用 查看   
  16. #16楼 废墟中的垃圾      2011-06-22 16:15
    @张亚
    这个最多 48跟,可以看楼上的关于奇偶的想法。所以你的这个算法是有问题的。
    而且我记得你的回复是4跟,你的算法里面优先了最后一种木棒长度。
     回复 引用 查看   
  17. #17楼 废墟中的垃圾      2011-06-22 16:29
    @左洸
    这个要好好研究一下,只要是穷举必须要把每一个棒子作为单独的对象处理
     回复 引用 查看   
  18. #18楼 废墟中的垃圾      2011-06-22 17:15
    老魏穷举还是没想到很好的办法,目前用了长度优先原则写了一个算法,感觉还不错
    http://www.cnblogs.com/52x/archive/2011/06/22/2087389.html
    大家一起看看,抛砖引玉
     回复 引用 查看   
  19. #19楼 左洸      2011-06-22 20:04
    楼主能否给出正式数据,原文中的样本数据,怎么找都是48个,一眼就能看出来了
     回复 引用 查看   
  20. #20楼 废墟中的垃圾      2011-06-22 20:08
    @左洸
    这个真的没有真实数据,我就是为了简单采用那个数据的。
    因为真实数据是没有最优,所以计算这个最优方式
     回复 引用 查看   
  21. #21楼 jankuo      2011-06-22 21:00
    应该要加上最大能够组成多少木棒,不然没意义了!最优解只有一个,但是解却是可能有很多的,尤其是木棒堆越大,解越多!

    如果是最多能够组成多少木棒,那么穷举法的方程式优化是重点,不然有可能是扰迷宫,好久都没绕出来

    还有,虽然和百鸡解体法类似,但是,又很多不同的,
     回复 引用 查看   
  22. #22楼 longware      2011-06-22 22:44
    跟24点一个道理
     回复 引用 查看   
  23. #23楼 张亚      2011-06-23 10:00
    采用穷举算法,以使用最少的木头为最优方案:
    http://www.cnblogs.com/zya-gis/archive/2011/06/23/2087798.html

    结果如下:
    48
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
    2+5+14
     回复 引用 查看   
  24. #24楼 废墟中的垃圾      2011-06-25 16:01
    @张亚
    兄弟误解了什么叫穷举法。 不过你这个的确是一种解决方案。
     回复 引用 查看