我正在使用C ++开发一个项目。我有n
个元素int
和K
。
我需要找到一种方法来获取min{a1+a2+....+an} - K <= ε >= 0
,其中ε=最小数字。
数字组合可以是{a1+a2+a6}
,也可以是{a2}
或{a2+an}
,我的意思是它不像find(n k)组合。
我正在研究小n(n <15),因此复杂性不是问题。
答案 0 :(得分:2)
想象一下,您找到了问题的多项式解,即您可以找到其总和最接近K
的数字子集。
现在想象一下这个算法:
- Find the subset of numbers with sum closest to K
- If (sum(subset) - K == 0)
- return subset
- Else
- return DOESNT_EXIST
这个算法是什么? the subset-sum problem的多项式解法!
由于P = NP的可能性很小,因此您不太可能找到任何可扩展的解决方案。
换句话说,你坚持使用蛮力。
答案 1 :(得分:0)
您可以使用位掩码进行暴力攻击。像这样:
#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;
}
答案 2 :(得分:0)
我打算为此编写伪代码:
您可以使用值列表创建可排序的地图。并在地图中放入a1..n元素的一个值及其值。并且将set compare方法插入&lt; 地图看起来像:
[n] [value]
列表将是ASC
要获得最小的数字,你可以从头开始进行列表操作并执行+操作直到mapelement [0] + mapelement [1]&gt; e + K
你将得到一张地图的第一个元素列表,其n值为