zb的生日

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
 
描述
今天是阴历七月初五,acm队员zb的生日。zb正在和C小加、never在武汉集训。他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜。当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?
 
输入
多组测试数据(<=1500)。数据以EOF结尾 第一行输入西瓜数量N (1 ≤ N ≤ 20) 第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出
输出分成两堆后的质量差
样例输入
5
5 8 13 27 14
样例输出
3
 思路:刚开始的dfs超时了好长时间,跟大神交流完全听不懂,还是太菜了;直接贴代码吧;
自己的代码:#include<stdio.h>
#include<algorithm>
using namespace std;
int melon[21],N,dd,sum;
void birth(int i,int teamer){
if(i<=N){
int x=sum-2*teamer;
 if(x<0)x=-x;
 dd=x<dd?x:dd;
 if(teamer>sum/2.0)return;
 birth(i+1,teamer+melon[i+1]);
 birth(i+1,teamer);
}}
int main(){
 while(~scanf("%d",&N)){sum=0;
  for(int i=1;i<=N;++i)scanf("%d",&melon[i]),sum+=melon[i];
  sort(melon+1,melon+N+1);
  dd=sum;
  birth(0,0);
  printf("%d\n",dd);
   }
 return 0;
}
大神的代码://虽然没有看懂;
//计科14-3陈振宇 2015/7/12 23:19:10
#include<stdio.h>
#include<math.h>
#include <cstring>
#include<algorithm>
using namespace std;
int melon[21],N,dd,sum;
int vis[21];
int ans;
void birth(int pos, int len)//当前搜索位置 当前西瓜总质量
{
 ans = min(abs(sum - len * 2), ans);//更新
 if(pos == N+1) return ; 
 if(len > sum / 2) return ;//剪枝 升序排列 当前已经超了 再往后搜也必超
 for(int i = pos; i <= N; i++)
 {
  if(vis[i]) continue;
  vis[i] = 1;
  birth(i+1, len+melon[i]);
  while(melon[i] == melon[i+1])//剪枝去掉后面与该西瓜质量相等的  题目数据不好这一步应该有用的 结果加上反而多了100ms
  ++i;
  vis[i] = 0;
 }
}
int main()
{
 while(~scanf("%d",&N))
 {
  sum=0;
  for(int i=1;i<=N;++i)
  scanf("%d",&melon[i]),sum+=melon[i];
  sort(melon+1, melon+N+1);//升序排序 质量大的西瓜影响大 剪枝
  ans = 10000000;
  memset(vis, 0, sizeof(vis));
  birth(1, 0);//当前位置 当前长度
  printf("%d\n", ans);
 }
 return 0;
}
刚开始自己参考的大神代码://虽然没剪枝,但时间运行却最短,没找出来原因;
#include<stdio.h> 
#include<math.h> 
int a[10000]; 
int dd;//用dd来保存最小差  
void fun(int sum,int cur,int m,int i)  
{     if (i<m)//最多选m个  
   {   //假设cur为其中一个的分得的和,如,sum=67,cur=35,t1=-3; 
      int t1=sum-2*cur; 
       if (t1<0)  
           t1=-t1;   
        if (t1<dd) //记下最小的t1;  
           dd=t1; 
        fun(sum,cur+a[i+1],m,i+1);//选a[i+1] 
        fun(sum,cur,m,i+1);//不选a[i+1];  
    }  } 
int main()  { 
   int m; 
   int i,j,sum=0; 
   while (scanf("%d",&m)!=EOF) 
  { 
        sum=0; 
        for (i=0;i<m;i++) 
       { 
         scanf("%d",&a[i]); 
          sum=sum+a[i]; 
       } 
        dd=sum; 
      fun(sum,a[0],m,0); 
        printf("%d\n",dd);  
    } 
   return 0; 

zb的生日(暴搜dfs)的更多相关文章

  1. nyoj325 zb的生日(DFS)

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  2. nyoj 325 zb的生日(dfs)

    描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb ...

  3. Usaco 2.3 Zero Sums(回溯DFS)--暴搜

    Zero SumConsider the sequence of digits from 1 through N (where N=9) in increasing order: 1 2 3 ... ...

  4. HDU 4284 Travel (Folyd预处理+dfs暴搜)

    题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...

  5. nyoj zb的生日【背包型DFS/选or不选】

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  6. hdu4848 DFS 暴搜+ 强剪枝

    题意:       给你一个图,然后问你从1出发遍历所有的点的距离和是多少,这里的距离和是每一个点到1的距离的总和,不是选择一条遍历所有点的路径的总长度,时间限制是 8000ms. 思路:       ...

  7. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] ...

  8. ACM zb的生日

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  9. Codeforces Round #238 (Div. 2) D. Toy Sum 暴搜

    题目链接: 题目 D. Toy Sum time limit per test:1 second memory limit per test:256 megabytes 问题描述 Little Chr ...

随机推荐

  1. 如何在自定义Listener(监听器)中使用Spring容器管理的bean

    正好以前项目中碰到这个问题,现在网上偶然又看到这个问题的博文,那就转一下吧. 原文:http://blog.lifw.org/post/46428852 感谢作者 另外补充下:在web Server容 ...

  2. pyqt labe界面超级链接例子学习

    def bz(self): self.lable1=QtGui.QLabel(u'<br><a href=http://windows.microsoft.com/zh-cn/win ...

  3. VC调试笔记

    1.windows-32调试: ①使用map文件根据崩溃地址寻找对应的源代码文件和行号 勾选project->settings->link->General mapfile,对应的P ...

  4. POJ1742:Coins(多重背包)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  5. PHP学习笔记三十【final】

    <?php //final不能去修饰属性(变量) //如果希望类不希望被继承就可以使用final关键字 final class Person() { public function sayHi( ...

  6. Android生命周期注意事项

                                    生命周期图解     以下英文引用全部来自google官方文档说明,方便理解. onCreate (Bundle savedInstan ...

  7. CGRect包含交错,边缘,中心的检测

    CGRectContainsPoint函数        判断给定的点是否被一个CGRect包含,可以用CGRectContainsPoint函数 BOOL contains = CGRectCont ...

  8. XML 解析中,如何排除控制字符

    XML 解析中,如何排除控制字符 今天在解析一个中文的 XML时,始终报错 PCDATA invalid Char value 21 in Entity ,查询了一下这个 21 的ascii 值,发现 ...

  9. sizeof对int long double char的使用

    主要针对int long char double 字节长度的识记. 1 #include <stdio.h> 2 3 int main() 4 { 5 int a[100]; 6 int ...

  10. 两个string数组对应比较

    最近做的array string类型对比.这个可能比较复杂,用的是linq 是请教别人的,我在这里记录一下 jquery 方法里面的数组 function arrtxt() { var arrt= [ ...