题目:
编程题:给定⼀组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于
S,则输出N个数的乘积最⼩的哪⼀项,没有则返回空;
程序如下:
测试主程序:
先看下测试示例,一组数据为{ 1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 13, 16 },求3项和为17的最小乘积,结果如下:
程序如下:
package com.test;import java.util.ArrayList;
import java.util.Collections;/*** 编程题:给定⼀组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于* S,则输出N个数的乘积最⼩的哪⼀项,没有则返回空;*/
public class Test{public static void main(String[] args) {int[] array = { 1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 13, 16 };ArrayList productList=new ArrayList();combine(array, array.length, 3, new int[3], 3, 17,productList);if(productList!=null && productList.size()>0){Collections.sort(productList);System.out.println("乘积的最小值为:"+productList.get(0));}else{System.out.println("乘积的最小值为:"+null);}}/**** @param a 待处理的正整数数组* @param n 数组的长度* @param m 要选择的元素的个数* @param b 存放结果的数组* @param bn 结果数组的个数* @param s 需要求得的数组元素之和* @param productList 存放所有结果的乘积*/public static void combine(int a[], int n, int m, int b[], int bn, int s,ArrayList productList) {for (int i = n; i >= m; i--) {b[m - 1] = i - 1;if (m > 1) { // 一共要选m个数,故m = 1时才结束递归combine(a, i - 1, m - 1, b, bn, s,productList);} else {if (isSum(a, b, bn, s)) {int product=1;for (int j = bn - 1; j >= 0; j--) {product=product*a[b[j]];System.out.print("数据为:" + a[b[j]]+" ");}System.out.println("乘积为:"+product);productList.add(product);}}}}/*** 判断数组b对应的数组a中的元素之和是否为s* @param a 数组a* @param b 数组b* @param n 数组b的长度* @param s 和* @return true:数组b对应的数组a中的元素之和是s* false:数组b对应的数组a中的元素之和不是s*/public static boolean isSum(int a[], int b[], int n, int s) {int ret = 0;for (int i = 0; i < n; i++) {ret += a[b[i]];}return s == ret;}
}