关于整型数组排列组合的问题

红拂故人 2014-07-17 04:47:19
加精
现在有一个自定义数组:
int[] a = {1,2,3,4,5,6};
有一个自定义变量:
int b = 10;


现在要求是:

在数组a中求出能等于b 的组合



例如:
1 2 3 4
2 3 5
1 4 5
1 3 6
...
这样的结果。

思路应该是要用递归解决。 看看有高手能给处理掉这个不???
...全文
1639 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_37162773 2016-12-26
  • 打赏
  • 举报
回复
都没看懂,纯小白
程序媛初九 2016-12-26
  • 打赏
  • 举报
回复
有一部分能看懂 但是让自己单独写 写不出
  • 打赏
  • 举报
回复
都是大神,现在看看这贴,还是觉得很牛! 一直没想通
liangbch 2014-07-22
  • 打赏
  • 举报
回复
这是一个典型的背包问题,其复杂度是O(2^n). 11楼说是O^2是不是打错了。基本思路是求n个元素的所有组合,n个元素的所有组合=c(n,0) + c(n,1) + ... c(n,n)=2^n. 不过在枚举过程中可采用适当的顺序和策略,提前过滤掉不可能的分支以加快搜索速度。
3x3只眼 2014-07-19
  • 打赏
  • 举报
回复
这个用普通的递归结合回溯来解决吧。给出一个python的算法,可以支持int数组内有负数的情形。如果能够保证数组中只有非负数的话,下面这个算法还可以稍作修改,结合剪枝策略来达到更小的时间消耗。

class Solution:

    def __init__(self):
        self.nums = None
        self.len_nums = 0
        self.total = 0
        self.combinations = [ ]

    def doGetlCombination(self, prefix, prefix_total, start):
        if start >= self.len_nums:
            return
        num = self.nums[start]
        if prefix_total + num == self.total:
            new_prefix = prefix[:]
            new_prefix.append(num)
            self.combinations.append(new_prefix)
        if prefix_total + num <= self.total:
            new_prefix = prefix[:]
            new_prefix.append(num)
            self.doGetlCombination(new_prefix, prefix_total + num, start + 1)
        self.doGetlCombination(prefix, prefix_total, start + 1)

    def getAllCombination(self, nums, total):
        self.nums = nums
        self.len_nums = len(self.nums)
        if 0 == self.len_nums:
            return [ ]
        self.total = total
        self.doGetlCombination([ ], 0, 0)
        return self.combinations

def main():
    nums = [1, 2, 3, 4, 5, 6, -1, 1]
    total = 10
    solu = Solution()
    print solu.getAllCombination(nums, total)
vnvlyp 2014-07-18
  • 打赏
  • 举报
回复
引用 1 楼 u012872817 的回复:
		int[] a = {1,2,3,4,5,6};
		int b = 10;
		
		for (int i=0;i<1<<a.length;i++){
			int sum = 0;
			String s = "";
			for (int j=0;j<a.length;j++){
				if ((i>>j&1)==1){
					sum += a[j];
					s += a[j]+" ";
				}
			}
			if (sum==b){
				System.out.println(s);
			}
		}
不过 i 应该从1开始吧,因为一个都没有的话不能算作组合
vnvlyp 2014-07-18
  • 打赏
  • 举报
回复
引用 1 楼 u012872817 的回复:
		int[] a = {1,2,3,4,5,6};
		int b = 10;
		
		for (int i=0;i<1<<a.length;i++){
			int sum = 0;
			String s = "";
			for (int j=0;j<a.length;j++){
				if ((i>>j&1)==1){
					sum += a[j];
					s += a[j]+" ";
				}
			}
			if (sum==b){
				System.out.println(s);
			}
		}
这个略吊。。
tony4geek 2014-07-18
  • 打赏
  • 举报
回复
引用 1 楼 u012872817 的回复:
		int[] a = {1,2,3,4,5,6};
		int b = 10;
		
		for (int i=0;i<1<<a.length;i++){
			int sum = 0;
			String s = "";
			for (int j=0;j<a.length;j++){
				if ((i>>j&1)==1){
					sum += a[j];
					s += a[j]+" ";
				}
			}
			if (sum==b){
				System.out.println(s);
			}
		}
略吊
xusir98 2014-07-18
  • 打赏
  • 举报
回复
formal1123 2014-07-18
  • 打赏
  • 举报
回复
回溯递归应该就可以了,(O^2)时间复杂度确实有点高,不知道有没有更好的
盘子饿了 2014-07-18
  • 打赏
  • 举报
回复
O(2^n),好凶残。
wkwdeveloper 2014-07-18
  • 打赏
  • 举报
回复
好厉害,写了好久写不出来
景语 2014-07-17
  • 打赏
  • 举报
回复
时间复杂度太高了……
  • 打赏
  • 举报
回复
引用 1 楼 u012872817 的回复:
		int[] a = {1,2,3,4,5,6};
		int b = 10;
		
		for (int i=0;i<1<<a.length;i++){
			int sum = 0;
			String s = "";
			for (int j=0;j<a.length;j++){
				if ((i>>j&1)==1){
					sum += a[j];
					s += a[j]+" ";
				}
			}
			if (sum==b){
				System.out.println(s);
			}
		}
学到了...
  • 打赏
  • 举报
回复
这个问题好刁,我表示我写了半天没写出来...坐等楼下答案
wwzhzh 2014-07-17
  • 打赏
  • 举报
回复
		int[] a = {1,2,3,4,5,6};
		int b = 10;
		
		for (int i=0;i<1<<a.length;i++){
			int sum = 0;
			String s = "";
			for (int j=0;j<a.length;j++){
				if ((i>>j&1)==1){
					sum += a[j];
					s += a[j]+" ";
				}
			}
			if (sum==b){
				System.out.println(s);
			}
		}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧