从n个数中找到和为m的数
程序员文章站
2022-03-01 17:46:56
...
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
/*
* Find the nums which sum is M
*/
public class FindMInN {
public static void main(String args[]) {
int arr[] = {1,2,4,7,11,15};
List<Integer> li = new ArrayList<Integer>();
li.add(1);
li.add(2);
li.add(4);
li.add(7);
li.add(11);
li.add(15);
//int arr[] = { 1, 2 ,2,2 };
Stack<Integer> stack = new Stack<Integer>();
findMInN(li, 2, 15, stack);
// findMInN(arr, 15, 0, stack);
}
// public static void findMInN(int arr[], int m, int k, Stack<Integer> stack) {
// if (k == arr.length) {
// return;
// }
//
// for (int i = k; i < arr.length; i++) {
// int remained = m - arr[i];
// stack.add(arr[i]);
// if (remained > 0) {
// findMInN(arr, remained, k + 1, stack);
// } else if(remained == 0){
// Iterator itr = stack.iterator();
// while (itr.hasNext()) {
// System.out.println(itr.next());
// }
// System.out.println("Find the combination!");
// }
// stack.pop();
// }
//
// }
public static void findMInN(List<Integer> li, int m, int remained, Stack<Integer> stack){
if(m == 1 && li.contains(remained)){
Iterator itr = stack.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
System.out.println("Remained " + remained);
System.out.println("Find the combination!");
return;
} else if(m == 1 && !li.contains(remained)) {
System.out.println("Not find element!");
return;
}
for(int i = 0; i < li.size(); i++){
List<Integer> remainedList = new ArrayList<Integer>();
for(int j = 0; j < li.size(); j++){
if(j != i){
remainedList.add(li.get(j));
}
}
stack.add(li.get(i));
findMInN(remainedList, m - 1, remained - li.get(i), stack);
stack.pop();
}
}
}
转载于:https://my.oschina.net/u/138995/blog/308568
上一篇: leetcode一些题的想法
推荐阅读
-
不能使用for循环,传入n和m,生成一个长度为n,每一项都是m的数组
-
编写程序,从键盘输入三个数字,分别求他们的和、平均数、积、最大值和最小值。
-
输入数据有多组,每组的第一行是两个整数m和n,表示应聘MM的总共的行列数,然后是m行整数,每行有n个,m和n的定义见题目的描述。
-
将一个数M随机分为N份,并限制每份的大小
-
1)的累加和(累乘积(阶乘))。其中n的值从键盘输入。输入一个2000年以后的年份n,输出所有介于2">
PTA判断输入的整数是否是素数,如果是则输出"1",否则输出"0." 编写程序,求自然数1至n(n>1)的累加和(累乘积(阶乘))。其中n的值从键盘输入。输入一个2000年以后的年份n,输出所有介于2
-
用程序生成n个随机数,要求n个数的和等于100
-
把2N个球放到M个盒子里(N>=M)使得各盒中的球数为偶数
-
输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等
-
蓝桥杯 算法训练 - 连续正整数的和 78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。 输入一个正整数 n(<=10000) 输出 m 行(n有m
-
不能使用for循环,传入n和m,生成一个长度为n,每一项都是m的数组