我的代码:
dis:两人财产的差值,p:物品个数
total:两人所得财产的总值
ans:当前两人所得财产总和的最大值
#include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> #include<math.h> using namespace std; __int64 a[30],sum[30],n,ans; __int64 fab(__int64 x) { if(x<0) return -1*x; return x; } void dfs(__int64 p,__int64 dis,__int64 total) { if(dis==0&&ans<total) ans=total; if(p==0) return; // if(fab(dis)>sum[n]/2) return;//此处剪枝可以删去 if(fab(dis)>sum[p]) return; if(total+sum[p]<=ans) return; dfs(p-1,dis+a[p],total+a[p]); dfs(p-1,dis-a[p],total+a[p]); dfs(p-1,dis,total); } int main() { int i; while(scanf("%d",&n)&&n) { for(i=1;i<=n;i++) scanf("%I64d",&a[i]); sum[0]=a[0]=0; sort(a+1,a+n+1); for(i=1;i<=n;i++) sum[i]=a[i]+sum[i-1]; ans=0; dfs(n,0,0); printf("%I64d\n",sum[n]-ans); } return 0; }