从具有重复元素的数组中随机找到一个组合,并且其总和等于 n

2023-12-06

如何从一个随机数中找到一个组合array具有重复元素且其总和相等n.

Example

  • array is [1, 2, 2, 3] and n is 3
  • 答案是1+2, 1+2, 3
  • If randomSubsetSum(array, n)是解,那么randomSubsetSum([1,2,2,3], 3)将返回其中之一1+2, 1+2, 3. Note: 1+2出现频率是3
  • 真实场景:从题库中随机选择问题进行考试

我发现了一些类似的问题和解决方案:

  1. Q: 找出所有可能的数字组合以达到给定的总和

    A: 溶液A and 溶液B

  2. Q: 具有 k 个部分的排序和非排序整数分区

    A: 溶液C

Defect

solution A and solution B不能随机找到组合。solution C不允许重复元素。

我的Java解决方案

public List<Integer> randomSubsetSum(List<Integer> list, Integer n) {
    list.removeIf(e -> e > n);
    int maxSum = list.stream().reduce(0, Integer::sum);
    if (maxSum < n) {
        throw new RuntimeException("maxSum of list lower than n!");
    }
    if (maxSum == n) {
        return list;
    }
    final SecureRandom random = new SecureRandom();
    // maybe helpful, not important
    final Map<Integer, List<Integer>> map = list.stream().collect(Collectors.groupingBy(Function.identity()));
    final List<Integer> keys = new ArrayList<>(map.keySet());
    final List<Integer> answers = new ArrayList<>();
    int sum = 0;
    while (true) {
        int keyIndex = random.nextInt(keys.size());
        Integer key = keys.get(keyIndex);
        sum += key;

        // sum equal n
        if (sum == n) {
            List<Integer> elements = map.get(key);
            answers.add(elements.get(random.nextInt(elements.size())));
            break;
        }

        // sum below n
        if (sum < n) {
            List<Integer> elements = map.get(key);
            answers.add(elements.remove(random.nextInt(elements.size())));
            if (elements.isEmpty()) {
                map.remove(key);
                keys.remove(keyIndex);
            }
            continue;
        }

        // sum over n: exists (below  = n - sum + key) in keys
        int below = n - sum + key;
        if (CollectionUtils.isNotEmpty(map.get(below))) {
            List<Integer> elements = map.get(below);
            answers.add(elements.get(random.nextInt(elements.size())));
            break;
        }

        // sum over n: exists (over  = sum - n) in answers
        int over = sum - n;
        int answerIndex =
                IntStream.range(0, answers.size())
                        .filter(index -> answers.get(index) == over)
                        .findFirst().orElse(-1);
        if (answerIndex != -1) {
            List<Integer> elements = map.get(key);
            answers.set(answerIndex, elements.get(random.nextInt(elements.size())));
            break;
        }

        // Point A. BUG: may occur infinite loop

        // sum over n: rollback sum
        sum -= key;
        // sum over n: remove min element in answer
        Integer minIndex =
                IntStream.range(0, answers.size())
                        .boxed()
                        .min(Comparator.comparing(answers::get))
                        // never occurred
                        .orElseThrow(RuntimeException::new);
        Integer element = answers.remove((int) minIndex);
        sum -= element;
        if (keys.contains(element)) {
            map.get(element).add(element);
        } else {
            keys.add(element);
            map.put(element, new ArrayList<>(Collections.singleton(element)));
        }
    }
    return answers;
}

At Point A,可能会出现无限循环(例如randomSubsetSum([3,4,8],13))或花费大量时间。如何修复这个bug或者有其他解决方案吗?


这是根据解决方案 A 稍加修改的解决方案。

from random import random

def random_subset_sum(array, target):
    sign = 1
    array = sorted(array)
    if target < 0:
        array = reversed(array)
        sign = -1
    # Checkpoint A

    last_index = {0: [[-1,1]]}
    for i in range(len(array)):
        for s in list(last_index.keys()):
            new_s = s + array[i]
            total = 0
            for index, count in last_index[s]:
                total += count
            if 0 < (new_s - target) * sign:
                pass # Cannot lead to target
            elif new_s in last_index:
                last_index[new_s].append([i,total])
            else:
                last_index[new_s] = [[i, total]]
    # Checkpoint B

    answer_indexes = []
    last_choice = len(array)
    while -1 < last_choice:
        choice = None
        total = 0
        for i, count in last_index[target]:
            if last_choice <= i:
                break
            total += count
            if random() <= count / total:
                choice = i
        target -= array[choice]
        last_choice = choice
        if -1 < choice:
            answer_indexes.append(choice)

    return [array[i] for i in reversed(answer_indexes)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从具有重复元素的数组中随机找到一个组合,并且其总和等于 n 的相关文章

  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 为什么我在 Mac 上看到“java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int)accessibl

    我已经在工作中愉快地构建代码好几天了 但突然我的一个项目 不是全部 失败并出现此错误消息 看看下面的答案吧 我是如何修复它的 起初我用谷歌搜索 看到很多有这个问题的人正在使用 Java 16 但我认为 错误 我正在使用 Java 11 因为
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 将鼠标悬停在 JButton 上并显示一条消息

    我想将鼠标悬停在 GUI 地图 上的多个 JButton 上并显示该位置的名称 例如曼彻斯特和伦敦 我的代码适用于一个按钮 但它不适用于多个按钮并打印最后一个按钮out所有按钮位置的消息 因为我有 10 个按钮 If button1是 tr
  • 无法注册 Word.ContentControl 事件

    我在使用 Word ContentControl 事件时遇到困难 我在当前选择上注册一个的代码是 Word run function context console log Creating cc let range context doc
  • 在谷歌图表上仅显示 7 天的数据

    我有一个谷歌图表 我只想在图表上向用户显示 7 天的数据 并且他们应该能够看到之前 7 天的数据 例如 如果我有 1 7 2017 到 15 7 2017 的数据 最初图表应仅显示 8 7 2017 至 15 7 2017 但如果用户愿意
  • QAbstractSocket::UnknownSocketError

    可能是什么原因造成的QAbstractSocket UnknownSocketError使用时QTcpSocket CODE 我使用以下代码收到此错误代码 this gt connect socket SIGNAL socketError
  • Spring Batch“无效的对象名称BATCH_JOB_INSTANCE”

    我创建了一个 Spring Batch 来查询 Azure SQL Server 数据库并将数据写入 CSV 文件 我没有create数据库的权限 我收到这个错误Invalid Object name BATCH JOB INSTANCE运
  • 如何在Google地图API中查找最近的城市

    我想找到距离我最近的澳大利亚城市example在此查看示例 我尝试使用 Google API 但没有用 我怎样才能实现这样的目标 你可以帮帮我吗 code is var map new google maps Map document ge
  • 模型类的正确 getter 上的 PropertyValueFactory 错误

    我正在尝试从 fxml 文件填充示例 javafx TableView 这是我的控制器方法 public class TestController implements Initializable FXML private TableVie
  • 什么是 Sharepoint(MOSS 2007) 开发/部署最佳实践

    我们正在工作中部署 sharepoint MOSS 2007 我正在尝试提出一种共享点开发和部署方法 我们有开发 质量保证 生产环境 我需要一种方法 最好是自动化部署从开发到质量保证以及从那里到生产的更改 我们正在创建网站集 Web 部件等
  • 求解正规方程会给出与使用“lm”不同的系数?

    我想使用以下方法计算一个简单的回归lm和普通矩阵代数 然而 我从矩阵代数获得的回归系数只有使用矩阵代数获得的回归系数的一半lm我不知道为什么 这是代码 boot example lt data frame x1 c 1L 1L 1L 0L
  • IBM Worklight - 如何重命名应用程序并更改其图标、启动图像

    我们使用现有的示例应用程序来启动 Worklight 的概念验证 我们对原始代码进行了大量更改 我们希望更改应用程序名称并自定义其图标和启动图像 我们已经设法在 xCode 中进行上述更改 名称 图标和启动画面 但这并不能满足未来从 Wor
  • MySQL将json对象附加到json对象数组

    在此表中 foo table我有一个专栏 foo ids其内容如下 id 432 id 433 我的问题是有没有办法将新的 json 对象附加到此列 例如 如果我有这个新对象 id 554 我想要我的foo ids列值变为 id 432 i
  • 更新命令上的 SQL Server 错误 - “当前命令发生严重错误”

    在 SQL Server Management Studio 中运行以下查询会出现以下错误 update table name set is active 0 where id 3 当前命令发生严重错误 如果有结果 则应丢弃 日志已被截断
  • 通过API删除github仓库

    我想使用 github API 删除存储库列表 但我得到了回应 message 凭据错误 documentation url https developer github com v3 重现步骤 首先 我在这里创建了一个个人访问令牌 htt
  • Selenium:如何通过executeScript()发送可变字符串

    我需要在系统内进行一些自动测试 有些字段得到了验证 这可能无法仅通过sendKeys 然后我正在这样做 它只是写了一些字符串 而不是整个字符串 尝试通过字符串迭代sendKeys 也不起作用 现在我正在尝试通过 javascript 将值输
  • 在c#中获取启动快捷方式

    假设我有一个可执行文件 当它启动时我想知道它是如何启动的 IE 我想知道是通过快捷方式启动还是直接启动 有了这个 string test Environment GetCommandLineArgs 0 我可以获得可执行文件的路径 但这始终
  • 如何异步运行PHP代码

    如何异步运行 PHP 代码而无需等待 我有一个很长的运行 几乎无限 应该在服务器启动时运行 并且应该异步处理而无需等待 我猜可能的选择是 在网页中运行代码并保持打开状态以执行该任务 从某些命令行实用程序调用脚本 我不知道如何 该脚本将在后台
  • 在javascript中查找三次贝塞尔曲线的所有点[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有一个带有 2 个控制点的三次贝塞尔曲线 起点和控制点是已知的 需要获取曲线的所有点 给定控制点 起点和终点 我想要实现的是 给定一个从1到曲线长
  • 自动授予 Azure Active Directory Web 应用程序权限

    我们公司正在开发一个基于Azure组件的系统和一个连接到Azure的客户端桌面应用程序 我们的安装代码通过 Azure API 和 Azure 部署自动化自动部署 Azure 组件 正在部署的这些组件之一是我们在 Azure Active
  • Twisted.Web 和 AJAX

    我在 Twisted Web 中实现了一个玩具 Web 服务 from twisted web import server resource http class RootResource resource Resource def ini
  • 从具有重复元素的数组中随机找到一个组合,并且其总和等于 n

    如何从一个随机数中找到一个组合array具有重复元素且其总和相等n Example array is 1 2 2 3 and n is 3 答案是1 2 1 2 3 If randomSubsetSum array n 是解 那么rando