ZJNU 1903

我的代码:
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;    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值