正文

随机算法2007-04-18 21:21:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/24995.html

分享到:

随机算法:呵呵,声明这篇里我们不谈科学的严谨,下面这道题听别人说用DF,DP等,我不知道怎 么DP,DF。因此弄了个随机数,随机分配硬币,当然也要用点小技巧,开始随机次数太 大搞了几次 Time Limit Exceeded,最后恼火了开了 100,我靠 ,这次 Wrong Answer,最后一 次了我搞了个 1000 ,终于 Accepted !这主要是在比赛的时候,如果实在没办法做,可以尝试用随机算法,运气好一次就可以Accepted ,当然也不排除永远不能 Accepted,主要看它的测试数据强不强了。呵呵,这样太没技术含量了,哪位朋友如果有好的解决办法,贴出来分享下啊 ! 分硬币  一个背包里面最多有100枚硬币,要将这些硬币分给两个人,使得两人得到的钱差距最小 。每枚硬币的面值范围是1分到500分,不允许将一枚硬币分开。  Input 第一行有一个非负整数m(m<=100),表示硬币数。第二行有m个正整数,表示每枚硬币 的面值,中间用空格分开。  Output 每组仅输出一个非负整数,表示两人所分到钱的最小差值。  Sample Input 32 3 541 2 4 6  Sample Output 01  #include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h> #define TIMES 1000int mycmp(const int*a,const int*b){ if(*a > *b)  return 1; if(*a < *b)  return -1; return 0;}int    main(){  int i,j,a[110],asave[110],min; int suma,sumb,k,t;  while(scanf("%d",&i) != EOF){  for(j = 0; j < i; j++)   scanf("%d",&a[j]);        memcpy(asave,a,sizeof(int)*i);  qsort(a,i,sizeof(int),mycmp);  for(min = 10000,j = 0; j < TIMES; j++){   for(suma = sumb = k = 0; k < i; k++){    t = rand()%i;    if(a[t] == -1){     for(t = 0; a[t] == -1; t++)      ;    }    if(sumb > suma)     suma += a[t];    else     sumb += a[t];    a[t] = -1;   }   memcpy(a,asave,sizeof(int)*i);   t = (suma > sumb ? suma-sumb : sumb - suma);   if(t < min)    min = t;  }  printf("%d\n",min); } return 0; }

阅读(5778) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册