编程求解,输入两个整数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);
}
}
求解思路:
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);
}
}
相关文章推荐
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- Java求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包动态规划问题求解)
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
- 第21 题 2010 年中兴面试题 编程求解: 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来.
- 输入两个正整数n和m,从数列1,2,3.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来.编程求解
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3…….n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来.
- 输入两个整数n和m,从数列1,2,3....n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 21.输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n和m,从数列1,2,3,...,n中随意取几个数,使其和等于m,将其所有可能的组合列出来。 回溯求解
- <仅是自己做笔记。。。系列-13>输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 一个中兴的面试题,输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解(c语言递归函数分解法)
- 输入两个整数n和m,从数列1,2.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.