- 转换成我们拿最大(二者相等)的时候,然后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; }