- 转换成我们拿最大(二者相等)的时候,然后sum一减,就可以知道那个最小的剩余是多少。(在进行一次转换,取次次差得最小值)
- 然后在转换成以每一个物品为基础,分为三种情况进行讨论。
#include<bits/stdc++.h>
using namespace std;
int res = INT_MAX;
void dfs(vector<int> item, int result1, int result2, int sum, int index, int n){
//base case 1
if(index==n){//物品已经选择完了
//base case 2 得两人选择结果相同才行
if(result1==result2){
res = min(res,sum-result1-result2);
}
return;//返回重新选择(不管是不是满足条件,反正我物品已经选择完了)
}
//三种选择
dfs(item, result1+item[index],result2, sum,index+1,n);
dfs(item, result1,result2+item[index], sum,index+1,n);
dfs(item, result1,result2, sum,index+1,n);
}
int main(){
int T,n,x;
cin>>T;
while(T--){
cin>>n;
vector<int> item;
for(int i=0; i<n;i++){
cin>>x;
item.push_back(x);
}
int sum = 0;//计算物品总价值
for(int i=0; i< n;i++){
sum+= item[i];
}
dfs(item,0,0,sum,0,n);
cout<<res<<endl;
res = INT_MAX;
}
return 0;
}