Skip to content

Commit

Permalink
a
Browse files Browse the repository at this point in the history
  • Loading branch information
KJ-Falloutlast committed Dec 21, 2022
1 parent cfeb273 commit 66f4c8b
Showing 1 changed file with 90 additions and 0 deletions.
90 changes: 90 additions & 0 deletions cpp/Algorithm.md
Original file line number Diff line number Diff line change
Expand Up @@ -8888,3 +8888,93 @@ int main()
return 0;
}
```
### 12-1-3.2N整数选择问题
```cpp
#include <iostream>
#include <vector>
using namespace std;
/*
整数选择问题:给定2n个整数,从里面挑选出n个整数,让选择的整数的和,和剩下的整数的和的差最小
*/
int arr[] = {1, 2, 3, 4};
const int length = sizeof(arr) / sizeof(arr[0]);
vector<int> x; // 记录子集中选择的元素
vector<int> bestx; // 记录最优解
int sum = 0; // 记录子集中所选数字的和
int r = 0; // 记录未选择数字的和
unsigned int minval = 0xFFFFFFFF; // 记录最小差值
int leftcnt = length; // 记录未处理的数字的个数(刚开始都未能处理,所以是length)
int cnt = 0; // 记录遍历的子集的个数,用于测试

void func(int i)
{
if (i == length)
{
cnt++;//计算次数是2^4 = 16
// 得到子集树的一个解,对应一个叶子节点
if (x.size() != length / 2)
{
return;//如果解的个数不等于原始长度的一半,那么就无效
}

int result = abs(sum - r);
if (result < minval)
{
minval = result;
bestx = x;
}
}
else
{
// Step 1.方法1
/*sum += arr[i];
r -= arr[i];
x.push_back(arr[i]);//选择arr[i]
func(i + 1); // 遍历i的左孩子,表示选择i号位元素
sum -= arr[i];
r += arr[i];
x.pop_back();//不选择arr[i]

func(i + 1);*/ //若是不加/**/优化的后果,那么就会执行2^3 = 8次

// Step 2.方法2
leftcnt--; // 表示处理i节点,表示剩余的未处理的元素的个数(表示处理了一个就减去1个)
if (x.size() < length / 2) // 剪左树枝,提高算法效率。选择数字的前提:还未选择够n个整数
{
sum += arr[i];// ! 还未选择够N个数的时候才需要执行push_back
r -= arr[i];
x.push_back(arr[i]);//选择arr[i]
func(i + 1); // 遍历i的左孩子,表示选择i号位元素
sum -= arr[i];
r += arr[i];
x.pop_back();//不选择arr[i]
}

//这里右树枝可不可以剪枝呢? 已选择的数字的个数 + 未来能选择的所有的数字的个数(i+1,i+2....n) >= n个元素
if (x.size() + leftcnt >= length / 2)
{
//已选择的元素个数 + 未处理的元素个数 >= n才往右走
func(i + 1); // 遍历i的右孩子,表示不选择i号位元素
}

//当前i节点已处理完成,回溯到其父节点了
leftcnt++;
}
}
int main()
{
for (int v : arr)
{
r += v;
}
func(0);
for (int v : bestx)
{
cout << v << " ";
}
cout << endl;
cout << "min:" << minval << endl;
cout << "cnt:" << cnt << endl;
return 0;
}
```

0 comments on commit 66f4c8b

Please sign in to comment.