java编程:给定⼀组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于 S,则输出N个数的乘积最⼩的哪⼀项,没有则返回空

题目:

编程题:给定⼀组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于

S,则输出N个数的乘积最⼩的哪⼀项 ,没有则返回空;

程序如下:

测试主程序:

先看下测试示例,一组数据为{ 1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 13, 16 },求3项和为17的最小乘积,结果如下:

程序如下:

java 复制代码
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;
    }
}
相关推荐
SweetCode2 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
守护者1705 分钟前
JAVA学习-练习试用Java实现“实现一个Hadoop程序,使用Hive进行复杂查询和数据筛查”
java·学习
程序员 小柴10 分钟前
docker的与使用
java·docker·eureka
ゞ 正在缓冲99%…15 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong16 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
Seven9729 分钟前
【Guava】并发编程ListenableFuture&Service
java
WannaRunning30 分钟前
浅谈Tomcat数据源连接池
java·oracle·tomcat
惊鸿.Jh35 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L36 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
forestsea38 分钟前
使用 Spring Boot 和 GraalVM 的原生镜像
java·spring boot·spring native·原生映像