您的位置:首页 > 编程语言

编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解) .

2014-09-21 15:38 573 查看
编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题。

求解思路:

1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n = m;

2.将最大数n加入且n == m,则满足条件,输出;

3.将n分两种情况求解,(1)n没有加入,取n = n - 1; m = m;递归下去;

(2)n加入,取n = n - 1, m = m - n,递归下去

import java.util.LinkedList;

import java.util.Stack;

public class Sum {

private static LinkedList<Integer> list = new LinkedList<Integer>();

private static Stack<Integer> stack = new Stack<Integer>();

/**

* 求解思路:

* 1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n=m;

* 2.将最大的数n加入且n==m,则满足条件,输出;

* 3.将n分两种情况求解:n没有加入,取n=n-1,m=m,递归;

* 4.n加入,取n=n-1,m=m-n,递归。

* 5.结束。

* @param sum

* @param n

*/

public static void findSum(int sum, int n)

{

if ( n < 1 || sum < 1)

return;

if (sum > n)

{

//list.add(n);

stack.add(n);

findSum(sum - n, n - 1);// n加入,取n=n-1,m=m-n

//list.pop();

stack.pop();

findSum(sum, n - 1); // n没有加入,取n=n-1,m=m

}

else

{

System.out.print(sum); // sum < n ,直接输出n就可以满足了

// for (int i = 0; i < list.size(); i ++)

// System.out.print(" "+ list.get(i));

// System.out.println();

for(int i=0;i<stack.size();i++)

System.out.print(" "+ stack.get(i));

System.out.println();

if(sum>2){

findSum(sum, sum-1);

}

}

}

//用栈和链表区别在与什么地方,为什么链表出来的结果不对2 4 3 而栈出来的是2 5 3

public static void main(String[] args) {

int sum = 10;

int n = 6;

findSum(sum,n);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐