• 全部
  • 问答

从一个有n个数字的随机数列中随意取k个数,使其和等于m

xiulidefeng2012 2014-11-30 05:56:57
从一个有n个数字的随机数列中取出k个数字,使其和等于m。求出所有可能的k个数字的组合。这个在原始的穷举上面能做什么改进呢,求大神点拨。
...全文
920 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
熊熊大叔 2014-12-03
背包问题,动态规划算法。自己去baidu吧
回复
xiulidefeng2012 2014-12-03
引用 6 楼 WizardOz 的回复:
我同意一楼的,但是他已经说完了,我就写个程序验证一下吧

import random

lst = list(range(1,21))
lst.reverse()

def solve(lst,goal,result = []):
    if goal > sum(lst):
        return
        
    for i in range(len(lst)):
        if lst[i] > goal:
            continue
        elif lst[i] == goal:
            print(result + [lst[i],])
            continue
        else:
            solve(lst[i + 1:],goal - lst[i],result + [lst[i],])

solve(lst,180)
请问这个算法时间复杂度是多少啊?
回复
WizardOz 2014-12-03
我同意一楼的,但是他已经说完了,我就写个程序验证一下吧

import random

lst = list(range(1,21))
lst.reverse()

def solve(lst,goal,result = []):
    if goal > sum(lst):
        return
        
    for i in range(len(lst)):
        if lst[i] > goal:
            continue
        elif lst[i] == goal:
            print(result + [lst[i],])
            continue
        else:
            solve(lst[i + 1:],goal - lst[i],result + [lst[i],])

solve(lst,180)
回复
cnmhx 2014-12-02
直接定义一种特殊的数据结构。 像在多维多项式展开中那样。 将特定阶数的单项全部列示出来就是了。
回复
xiulidefeng2012 2014-12-02
引用 1 楼 truelance 的回复:
先对数字排序,然后回溯+剪枝。比如一个组合已经超过目标值,那么把其中一个值换成后面的值肯定还会超标
如果要求的和m 是最大值的情况呢,就是不会有超过它的情况出现
回复
xiulidefeng2012 2014-12-01
如果要求的和m 是最大值的情况呢,就是不会有超过它的情况出现
回复
熊熊大叔 2014-11-30
先对数字排序,然后回溯+剪枝。比如一个组合已经超过目标值,那么把其中一个值换成后面的值肯定还会超标
回复
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2014-11-30 05:56
社区公告
暂无公告