nyoj 325 dfs 搜索平分问题

来源:互联网 发布:网站关键词优化方案 编辑:程序博客网 时间:2024/04/28 17:53

点击打开链接

思路:

这个题我一开始还是用了一个01背包 因为我觉得挺像的,结果有地方没处理好  TLE了

就改用了dfs,也很水其实0.0  我还调了老半天... 每个物品就只有在哪个集合两种状态

对于这个题我们就看成每个人都分总和的一半,去找最大值...

剪枝与否都不会超时:

1.当前的最大值等于一半  剪枝

2.取下一个物品 不导致最大值改变  剪枝.

 #include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;typedef long long ll;int w[22],n;int ans=0,aver;void dfs(int x,int s){if(x==n+1){ans=max(ans,s);return ;}if(ans==aver&&s+w[x]>ans)return ;if(s+w[x]<=aver)dfs(x+1,s+w[x]);dfs(x+1,s);return ;}int main(){while(scanf("%d",&n)!=EOF){ans=0;int sum=0;for(int i=1;i<=n;i++){scanf("%d",&w[i]);sum+=w[i];}aver=sum/2;dfs(1,0);printf("%d\n",sum-2*ans);}return 0;}        

0 0
原创粉丝点击