在LeetCode上有两数之和,三数之和,四数之和的问题…
干脆直接写一个N数之和
问题描述
已知数组A[0…N-1],给定某数值sum,找出数组中的若干个数,使得这些数的和为sum
解决方法
设一个bool向量x[0…N-1]
- x[i]=0表示不取A[i],x[i]=1表示取A[i]
- 这是个NP问题
首先采用直接递归(枚举法)
代码如下:
#include <iostream>
#include <memory.h>
#include <time.h>
using namespace std;
int a[] = {
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int size = sizeof(a) / sizeof(int);
int sum = 10; //sum为计算的和
void Print(bool* x){
for(int i = 0; i < size; ++i) {
if(x[i] == 1)
cout << a[i] << " ";
}
cout << endl;
}
//x[]为最终解,i为考察第x[i]是否加入,has表示当前的和
void EnumNumber(bool* x, int i, int has) {
if(i >= size)
return;
if(has + a[i] == sum) {
x[i] = true;
Print(x);
x[i] = false;
}
x[i] = true;
EnumNumber(x