这是今年迅雷面试题,原题如下:
给定整数n,取若干个1到n的整数可求和等于整数m,编程求出所有组合的个数。比如当n=6,m=8时,有四种组合:[2,6], [3,5], [1,2,5], [1,3,4]。限定n和m小于120
输入描述:
整数n和m
输出描述:
求和等于m的所有组合的个数。
输入例子1:
6 8
输出例子1:
4
首先这是一个动态规划问题,类似于背包问题, 不同的是其每个数的权重就是其本身,并且最后求得的结果是组合的个数,而不是组合的方法。分成以下几种情况:
1.当n<1或者m<1时,就没有组合数了。
2.当n=m时,此刻有一种稳定的组合方法就是n=m这一种。
3.当n>m 时, 数字大于m的组合都不存在,比如m=4,n=6.那么5,6,两个数组就不可能出现在组合里了,所以令n=m只要计算f(4,4)的个数就行了。
4.当n<=m时,就是往容量为m的包里填个数了,因为n=m在(2) 中稳定存在一种组合方式。所以只要计算n<m的递归式就行了。
V(n, m)=max{V(n-1, m-n)+Vi,V(n-1, m)}
java实现代码如下:
public class bag01_question {
public int bag(int n ,int m) {
if(n==0||m==0)
return 0;
if(n>m)
n=m;
int sum = 0;
if(m==n)
sum++;
sum+= bag(n-1,m);
sum+= bag (n-1,m-n);
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner ms = new Scanner(System.in);
int n = ms.nextInt();
int m = ms.nextInt();
int mo = new bag01_question().bag(n,m);
System.out.println(mo);
}
}