给定2个数字,n,m,使得从1到n之间的数字组合,他们的和等于m,求所有组合

这个题目也是非常经典的问题,把一个数字分解成多个数字的组合之和,问有多少种可能,并输出。

微软比赛题目,对于这类题目,最为简单的版本就是,给定一个排好序的数字,求,这个数组中的任意两个数字之和,等于给定的值。

这个就相对比较,简单,2个指针,移动他们的位置,和比给定的大,指针往前挪动,否则,另外一个指针往后挪动。

然后,这个是2个数字的情况,那么多个数字怎么考虑??

如下,具体的测试,看上篇文章,这里主要是把程序粘贴了出来。

强调一句,如果,你能理解里面的那个2个递归(helper),他们之间的关系,以及下标i的变化,我只能说你真的明白,递归的过程了,否则,确实不好理解。

class Test1{
	void findAllAnswer(int n,int dest){
		int[]arr=new int[n];
		helper(dest,0,arr,n);
	}

	private void helper(int dest, int i,int[] arr , int n) {
		// TODO Auto-generated method stub
		if(dest==0)
			prints(arr,n);
		if(dest<=0||i==n) return;
			helper(dest,i+1,arr,n);
		arr[i]=1;
		helper(dest-i-1,i+1,arr,n);
		arr[i]=0;
	}

	private void prints(int[] arr, int n) {
		// TODO Auto-generated method stub
		for(int i=0;i<n;i++){
			if(arr[i]==1)
				System.out.print("+"+(i+1));
		}
		System.out.println();
		}
}
如果实在没看懂,请留言。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值