Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm n个元素之间的最小差值 我正在做一个C++项目。我有n元素int和K_Algorithm_Language Agnostic - Fatal编程技术网

Algorithm n个元素之间的最小差值 我正在做一个C++项目。我有n元素int和K

Algorithm n个元素之间的最小差值 我正在做一个C++项目。我有n元素int和K,algorithm,language-agnostic,Algorithm,Language Agnostic,我需要找到一种方法来得到ε=最小数的min{a1+a2+..+an}-K=0 数字的组合可以是{a1+a2+a6}或者仅仅是{a2}或者{a2+an},我的意思是它不像find(nk)组合 我正在研究一个小的n(n=k&(最佳求和==-1 |求和j)和1){ cout我将为此编写伪代码: 您可以创建一个具有值列表的可排序映射。要在映射中放入a1..n元素的一个值及其值。并且在插入set compare方法时< 地图看起来像: [n] [value] 名单将是ASC 为了得到最小的数字,您可以从

我需要找到一种方法来得到ε=最小数的
min{a1+a2+..+an}-K=0

数字的组合可以是
{a1+a2+a6}
或者仅仅是
{a2}
或者
{a2+an}
,我的意思是它不像find(nk)组合


我正在研究一个小的n(n<15),所以复杂性不是一个问题。

您可以使用位掩码进行暴力攻击。像这样:

#include <iostream>
using namespace std;

int main()
{
    int n = 15;
    int a[] = {8, 6, 14, 3, 4, 11, 100, 24, 41, 56, 18, 22, 11, 39, 91};
    int k = 16;
    int best_sum = -1;
    int best_i = -1;
    for(int i = 0; i < (1 << n); i++) {
        int sum = 0;
        for(int j = 0; j < n; j++) {
            if((i >> j) & 1) {
                sum += a[j];
            }
        }
        if(sum >= k && (best_sum == -1 || sum < best_sum)) {
            best_sum = sum;
            best_i = i;
        }
    }
    cout << best_sum << " ->";
    for(int j = 0; j < n; j++) {
        if((best_i >> j) & 1) {
            cout << " " << a[j];
        }
    }
    cout << endl;
    return 0;
}
#包括
使用名称空间std;
int main()
{
int n=15;
INTA[]={8,6,14,3,4,11,100,24,41,56,18,22,11,39,91};
int k=16;
int最佳_和=-1;
int-best_i=-1;
对于(int i=0;i<(1>j)和1){
总和+=a[j];
}
}
如果(求和>=k&(最佳求和==-1 |求和<最佳求和)){
最佳和=和;
最佳_i=i;
}
}
cout>j)和1){

cout我将为此编写伪代码:

您可以创建一个具有值列表的可排序映射。要在映射中放入a1..n元素的一个值及其值。并且在插入set compare方法时< 地图看起来像:

[n] [value]
名单将是ASC

为了得到最小的数字,您可以从一开始就遍历列表并执行+操作,直到mapelement[0]+mapelement[1]>e+K


你会有一个地图上第一个元素的列表,它们的n值

想象你找到了问题的多项式解,也就是说,你可以找到一个子集,其和最接近于
K

现在想象一下这个算法:

- Find the subset of numbers with sum closest to K
- If (sum(subset) - K == 0)
-     return subset
- Else
-     return DOESNT_EXIST
这个算法是什么?一个多项式解

因为p=NP的可能性很小,所以很难找到任何可伸缩的解决方案


换句话说,你被暴力困住了。

如果复杂性不是一个问题,你知道暴力解决方案是什么样子吗?是的,我已经准备好了这方面的代码,但它可能不适用于高N,所以我想找一个更好的,以防万一。实际上,N代表“建筑物”在L5R中的玩家。他永远不会得到超过10-15个“建筑物”,因为甲板的大小是[40-60],但我仍然想确定。让我重新表述一下这个问题。你正在寻找一个数字的子集,其总和最接近(及以上)
K
?对不起,我误解了你。是的,这就是我要找的。Sum-K必须>=0,所以如果你不能用电路板中的元素精确求出K的和,那么你的代码就不能工作。你可以在这种情况下尝试,以确保它工作,而不是错误地假设它不工作。但是我做到了。设置K=1234并运行它。它将p打印总和小于1234的整个数组当所有元素总和小于K时,它将不起作用,因为这种情况没有得到处理,我已经编写了代码来演示它是如何工作的,您可以为特殊情况设置if条件。除非enough@user2147971,请随意选择对您有帮助的答案,并接受一个that解决了你的问题。@Shahbaz Upvoting要求你自己有15个代表,所以如果你喜欢这个问题,你应该先投票:)(我两个都喜欢,所以问题和答案都加1。)