#include<iostream>#include<cmath>usingnamespace std;int n;//n个棍子 int stick[15];//每个棍子的长度 int MAX;//满足题意所能拼成的最大长度 int sum;//所有棍子的总长度 //函数参数:假设分左右两边,左边棍子总长度L,右边棍子总长度R,棍子数组stick,棍子总数n,剩余棍子总长度rest,当前棍子索引cur //函数功能:在保证左右两边棍子相等的条件下,使左右两边棍子尽可能长 voidf(int L,int R,int stick[],int n,int rest,int cur){//当两边棍子之差大于剩余棍子总长度时,不可能满足左右两边棍子相等,结束递归 if(abs(L-R)>rest){return;}//当两边棍子长度相等时,更新最大长度 if(L==R && MAX<L){
MAX = L;}//当两边棍子长度不相等时,当前棍子有三种放置方法: for(int i=cur; i<n; i++){//1.当前棍子放在左边 f(L+stick[i], R, stick, n, rest-stick[i], cur+1);//2.当前棍子放在右边 f(L, R+stick[i], stick, n, rest-stick[i], cur+1);//3.当前棍子舍弃
cur++;}}intmain(){
cin>>n;for(int i=0; i<n; i++){
cin>>stick[i];
sum += stick[i];}f(0,0, stick, n, sum,0);
cout<<MAX<<endl;return0;}
方案2 数学公式(参考网上题解)
#include<iostream>#include<algorithm>usingnamespace std;int n;//n个棍子 int stick[15];//每个棍子的长度 int MAX;//满足题意所能拼成的最大长度 int sum;//所有棍子的总长度 intmain(){
cin>>n;for(int i=0; i<n; i++){
cin>>stick[i];
sum += stick[i];}
sum /=2;sort(stick, stick+n);// 关键思想(我没证出来,但确实对了) for(int i=n-1;i>=0;i--){if(sum-MAX >= stick[i]){//比较得出最大长度
MAX += stick[i];}}
cout<<MAX<<endl;return0;}