一、题目描述
给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R。
组装规则:
- R中元素总和加起来等于M;
- R中的元素可以从N中重复选取;
- R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)
二、输入描述
第一行输入是连续数组N,采用空格分隔;
第二行输入数字M;
三、输出描述
输出的是组装办法数量,int类型。
四、补充说明
1 <= N.length <= 30
1 <= N.length <= 1000
五、Java算法源码
/**
* 给你一个整数M和数组N
*
* N中的元素为连续整数,要求根据N中的元素组装成新的数组R
*
* 1、R中元素总和加起来等于M
* 2、R中的元素可以从N中重复选取
* 3、R中的元素最多只能有1个不在N中,且比N中的数字都要小(不能为负数)
*/
// 组装办法数量
private static int sum = 0;
private static int min = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 连续数组N,采用空格分隔
String[] N = sc.nextLine().split(" ");
// 新数组R数字之和 = 数字M
int M = sc.nextInt();
// 数组N
int[] arr = new int[N.length];
for (int i = 0; i < N.length; i++) {
arr[i] = Integer.parseInt(N[i]);
// 取数组N的最小值
min = Math.min(min, arr[i]);
}
get(0, arr, M, 0);
System.out.println(sum);
}
/**
*
* @param idx
* @param n 连续数组N,采用空格分隔
* @param M 新数组R数字之和 = 数字M
* @param rSum 新数组R数字之和
*/
public static void get(int idx, int[] n, int M, int rSum) {
if (rSum == M) {
sum++;
return;
}
if (rSum > M) {
return;
}
/**
* R中的元素最多只能有1个不在N中,且比N中的数字都要小
*
* 新数组R数字之和 - 当前新数组R数字之和 <= 取数组N的最小值
*/
if (M - rSum <= min - 1) {
sum++;
return;
}
for (int i = idx; i < n.length; i++) {
get(i, n, M, rSum + n[i]);
}
}
六、效果展示
1、输入
2 3 5
8
2、输出
5
3、说明
- 2 2 2 2
- 2 3 2 1
- 2 5 1
- 3 5
- 2 3 3
🏆下一篇:华为OD机试真题 Java 实现【投篮大赛】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。