面试碰到的题,数据结构,算法什么的早忘干净了,没答上来。。。
大神看下这样做行不?
好像用什么动态规划算法挺做的,那个还没看,有会的大神帮个忙啊
/*
* 有集合N={1,2,3……,n},求a1+a2+……+an=m(ai属于N不等于0,i=1,2,……n)的所有组合,m,n都是自然数
*/
public static void func1(int n, int m, int k, int door){
if(n>m) n = m;
if(m==1&&m>=k){
System.out.println("1");
return;
}else if(n==1){
if(m<=door)
System.out.println(m);
return;
}else {
int i = 0;
while(n*i<=m){
if(i>=k){
if(i>0)
System.out.print(i+"+");
func1(n-1,m-i,i,door);
}
i++;
}
}
}
public static void main(String[] args) {
func1(6,6,0,6);
}
--------------------编程问答--------------------
楼主,你要做什么!我什么都没有!
--------------------编程问答--------------------
就是对任意的自然数n,m,取任意多个小于等于n的自然数相加,结果等于m,求所有的这种组合。
--------------------编程问答--------------------
上面的算易做图丢掉一些元素,造成输出的表达式不全。下面的算法用数组记住以输出的表达式,再加上每次迭代后的新表达式,就不会出现上面的问题。
public class Suanfa {
/*
* 有集合N={1,2,3……,n},求a1+a2+……+aj=m(aj属于N)的所有组合,m,n都是自然数
*/
public static void func1(int n, int m, int k, int door, int[] a){
if(n>m) n = m;
if(m==1&&m>=k){
a[a.length-n]=1;
printA(a);
return;
}else if(n==1){
if(m<=door){
a[a.length-n]=m;
printA(a);
}
return;
}else {
int i = 0;
while(n*i<=m){
if(i>=k){
if(i>0)
a[a.length-n]=i;
func1(n-1,m-i,i,door,a);
}
i++;
}
}
}
public static void printA(int[] a){
for(int i = 0; i < a.length; i++){
if(a[i]>0&&i!=a.length-1){
System.out.print(a[i]+"+");
}else if(a[i]>0){
System.out.print(a[i]);
}
}
System.out.println();
}
public static void main(String[] args) {
//func1_1(6,6,0,6);
func1(3,6,0,3,new int[3]);
}