package com.test;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author 唐学俊
* @create 2018/09/22
* 给定整数n,取若干个1到n的整数可求和等于整数m,
* 编程求出所有组合的个数。比如当n=6,m=8时,
* 有四种组合:[2,6], [3,5], [1,2,5], [1,3,4]。
* 限定n和m小于120
* 5 2
* 4 3 1
* 3 3 1
**/
public class SumTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
System.out.println(calculate(n, m));
}
/**
* 存在n个数小于n,且n个数之和等于m
*
* @param n
* @param m
* @return
*/
private static int calculate(int n, int m) {
List<Integer> rangeList = IntStream
.rangeClosed(1, n)
.boxed()
.filter(x -> x < m)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
return sum(rangeList, m);
}
private static int sum(List<Integer> integerList, int m) {
int count = 0;
for (int j = 0; j < integerList.size(); j++) {
int temp = integerList.get(0);
List<Integer> tempList = new ArrayList<>(integerList);
for (int i = 1; i < tempList.size(); i++) {
if (temp + tempList.get(i) <= m) {
temp += tempList.get(i);
tempList.remove(i);
i--;
}
if (temp == m) {
count++;
temp = tempList.get(0);
}
}
integerList.remove(0);
}
return count;
}
}
1
最新推荐文章于 2021-03-04 23:42:16 发布