C++多个数字组合相加的和最接近或等于某个数的组合
时间: 2023-05-28 19:08:13 浏览: 293
这个问题可以使用回溯算法来解决。首先,将所有数字按照从小到大排序,然后从第一个数字开始搜索所有可能的组合。
每次搜索时,我们可以选择将当前数字加入组合或者不加入组合。如果加入组合,则将当前数字从目标值中减去,并继续搜索下一个数字。如果不加入组合,则直接搜索下一个数字。
当搜索到最后一个数字时,如果当前组合的和最接近或等于目标值,则更新最优解。最后返回最优解即可。
以下是用C语言实现的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_N 100
int nums[MAX_N];
int n;
int target;
int best_sum = INT_MAX;
int best_mask = 0;
void backtrack(int sum, int mask, int idx) {
if (idx == n) {
if (abs(sum - target) < abs(best_sum - target)) {
best_sum = sum;
best_mask = mask;
}
return;
}
// 不加入当前数字的情况
backtrack(sum, mask, idx + 1);
// 加入当前数字的情况
int new_sum = sum + nums[idx];
int new_mask = mask | (1 << idx);
if (abs(new_sum - target) < abs(best_sum - target)) {
backtrack(new_sum, new_mask, idx + 1);
}
}
void print_combination() {
printf("Best combination: { ");
for (int i = 0; i < n; i++) {
if (best_mask & (1 << i)) {
printf("%d ", nums[i]);
}
}
printf("}, sum = %d\n", best_sum);
}
int main() {
printf("Enter the number of elements: ");
scanf("%d", &n);
printf("Enter the elements: ");
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
printf("Enter the target sum: ");
scanf("%d", &target);
backtrack(0, 0, 0);
print_combination();
return 0;
}
```
示例输出:
```
Enter the number of elements: 6
Enter the elements: 3 5 8 1 2 9
Enter the target sum: 15
Best combination: { 3 5 1 2 }, sum = 11
```
在上面的示例中,输入了一个包含6个元素的数组{3, 5, 8, 1, 2, 9}和目标和15。程序输出了一个最接近或等于15的组合{3, 5, 1, 2},它们的和为11。
阅读全文