题目详情 - 坤坤爱下蛋 - 南阳理工学院OJ (nyist.edu.cn)
思路:深度优先搜索
如果想让a b的差值最小,那么就要让a b的值最接近。如果a b的和是sum,我们只需要找a,让他在小于等于sum/2的范围内最大,b也能出来了 (因为a + b = sum) 满足题意
值得一提的是,必须在搜索终点判断一下,是不是已经达到了该数据已经能达到的最大值,如果达到了继续搜索是没有意义的,还会TLE,直接输出并结束就行了。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[120], b[120];
int nowsum, suitsum; //当时的和与最优的和
int sum;
int n;
int ans;
void dfs(int x) // 深度优先搜索
{
if (x > n)//终点
{
suitsum = max(suitsum, nowsum); //记录目前的 最优解
if (suitsum == sum / 2) //如果已经达到所有数据的最优解,直接输出并结束 不然会TLE
{
ans = abs(suitsum - (sum - suitsum));
cout << ans << endl;
exit(0);
}
return;
}
if (nowsum + a[x] <= sum / 2) // 两个if作为枚举的对象
{
nowsum += a[x];
dfs(x + 1);//递进
nowsum -= a[x]; //回溯
}
if (nowsum + b[x] <= sum / 2)
{
nowsum += b[x];
dfs(x + 1);//递进
nowsum -= b[x];//回溯
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
for (int i = 1; i <= n; i++)
{
cin >> b[i];
sum += b[i];
}//读入a b数组并记录总和
dfs(1);
ans = abs(suitsum - (sum - suitsum));
cout << ans << endl;
return 0;
}