当前位置: 首页 > 知识库问答 >
问题:

优化这个组合学算法

国兴贤
2023-03-14

假设给你一个数字,N,这是你的目标数字。然后给你一系列p个数,你必须找到这些数中大于N的最小和,也就是说,它最小地超过了N(或者等于N)。

你可以取任意元素组合的任意和。p可以大到100。

我目前的算法:在扫描所有信息后,我创建了一个100位长的位集,并通过使用循环将从0到(2^p)-1的所有整数转换为它,有效地结束了000…000和111…111之间的所有二进制数。

如您所知,这些向量可以被解释为p个数的每个可能的不同组合,其中第i个位置的0表示组合中不包括第i个数,而1表示组合中包含第i个。

现在,通过循环这个位集并检查每个组合,我肯定能够达到我的目标,因为我已经检查了每个可能的组合。如果所有数字加在一起都不足以达到目标,那么就没有解决方案。

实际代码:

#include <cstdlib>
#include <iostream>
#include <cmath>
#include <bitset>

using namespace std;

int main()
{
    int N, p;
    cin >> N >> p;
    int bars[p], tot = 0;
    for (int j=0;j<p;j++){
        cin >> bars[j];
        tot += bars[j];
    }
    if (tot < N) cout << "NO SOLUTION" << endl;
    else {
         int diff = 3000;
         for (int j=0;j<pow(2.0,p)-1;j++){
             tot = 0;
             bitset<100> x(j);
             for (int k=0;k<p;k++){
                 if (x[k] == 1) tot += bars[k];
             }
             if (tot == N) {
                cout << N << endl;
                break;
             }
             if (tot-N>0&&tot-N<diff) diff = tot-N;
         }
         cout << N+diff << endl;
    }
    return 0;
}

问题:因为我们最多可以有100个数字,所以可能的组合数量很大,这是不可行的。我已经能够通过使用这种方法解决这类问题,但是它们最多包含20个数字,这使得计算成为可能。这让我想到一定有更好的方法来计算这个问题。

我没有使用的额外信息:问题伴随着我在设计算法时没有考虑的额外信息,这些信息可能对优化算法有用。这些数据是:

  • 100个≤ N≤ 2500
  • N是10的倍数
  • 5个≤ p≤ 100
  • 每个数字都在50和2500之间
  • 它们也都是10的倍数

问题:我一直在思考一种优化算法的方法,我意识到这是你能做的最蛮力的事情,但是,我在这个目标上失败了。任何人都可以帮助我优化这一点,以便得出的计算是合理的吗?这是有时间限制的,即使我忽略了,我相信它不会很高。

提前谢谢。

共有1个答案

经伟
2023-03-14

目前这并不适用于所有需要的p值,除了超时之外,int不能容纳100位。有一个O(p)动态规划算法可以解决这个问题,正如在另一个问题中提到的:寻找超过阈值的最小子集和的线性算法

 类似资料:
  • 我对C很在行,我正在尝试做一些黑客挑战,以此作为解决这个问题的方法 现在我正在努力解决愤怒的孩子们的问题:https://www.hackerrank.com/challenges/angry-children 基本上,它要求创建一个程序,给定一组N个整数,为该集合的K长度子集找到最小可能的“不公平”。不公平定义为K长度子集的最大值和最小值之间的差值。 我现在要做的是找到所有的K长度子集,计算它们

  • 1,1 2,1 2 3 4,1 2 3 4 5,1 2 3 4 5 6,1 2 3 4 5 6 7 7,1 2 3 4 5 6 7 8 9 1 0,1 2 3 4 5 6 7 8 9 1 0 1 1 1,1 2 3 4 5 6 7 8 9 1 0 1 1 1,1 2 3 4 5 6 7 8 9 1 0 1 1......... 给我一个索引(1<=index<=10^10),我需要找到该索引中的数

  • 将浮点转成定点运算,就一个目的,减少算法运算的 cycles 数,提高算法的效率。

  • 将浮点转成定点运算,就一个目的,减少算法运算的 cycles 数,提高算法的效率。

  • 我试图通过扁平化视图层次结构来优化Android应用程序中的布局。这里有一个特别难的问题! 此布局有一个主线布局,用于容纳顶行和底行(它们本身就是水平的子线布局)。中间的四个项目中的每一个都是使用LayOut权重来展开的垂直相对性(以适应图像视图和文本视图)。包含两个项目的每一行也是一个水平线性布局。 不用说,这种布局效率非常低,在绘制时会导致许多“编排者跳过了帧”的消息。我想删除这些嵌套的布局,

  • 主要内容:Nelder–Mead单纯形算法, 最小二乘,求根包提供了几种常用的优化算法。 该模块包含以下几个方面 - 使用各种算法(例如BFGS,Nelder-Mead单纯形,牛顿共轭梯度,COBYLA或SLSQP)的无约束和约束最小化多元标量函数() 全局(蛮力)优化程序(例如,,) 最小二乘最小化()和曲线拟合()算法 标量单变量函数最小化()和根查找() 使用多种算法(例如,Powell,Levenberg-Marquardt混合或Newton-Kr