nyoj zb的生日(DFS)
来源:互联网 发布:六仔信誉盘源码 编辑:程序博客网 时间:2024/05/21 11:22
zb的生日
原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=325
- 输入
- 多组测试数据(<=1500)。数据以EOF结尾
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量 - 输出
- 输出分成两堆后的质量差
- 样例输入
55 8 13 27 14
- 样例输出
3
ps:初步接触深搜,自己写的时间复杂度比较高
代码:
#include<stdio.h>#include<string.h>#include<stdlib.h>int n;int a[22],s;void dfs(int s1,int s2,int i){ if(i==n) { if(abs(s1-s2)<s) s=abs(s1-s2); return ; } dfs(s1+a[i+1],s2,i+1); dfs(s1,s2+a[i+1],i+1);}int main(){ while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); int i; for(i=1;i<=n;i++) { scanf("%d",&a[i]); } s=0xffffff; dfs(0,0,0); printf("%d\n",s); }}
最优代码:
#include <stdio.h>#define max(a,b) a>b?a:bint V,ans,n,w[21],sum[21];void dfs(int i,int cnt){ if(i == 0)//到达底部时 { ans = max(ans,cnt);//找到最接近V的 return ; } if(ans == V || cnt+sum[i] <= ans)//已经找到v结束或者cnt加上前面的所有元素之和比ans小,说明此路不优,结束 return ; if(cnt+w[i] <= V) dfs(i-1,cnt+w[i]); dfs(i-1,cnt);}int main(){ while(~scanf("%d",&n)) { ans = 0; for(int i=1; i<=n; i++) { scanf("%d",&w[i]); sum[i] = sum[i-1] + w[i]; } V = sum[n]/2; dfs(n,0); printf("%d\n",sum[n]-2*ans); } return 0;}
1 0
- nyoj zb的生日 (DFS)
- NYOJ 325 zb的生日 (DFS)
- nyoj zb的生日(DFS)
- nyoj 325 zb的生日(dfs)
- NYOJ 325 zb的生日,平分问题(DFS)
- nyoj 325 zb的生日 dfs
- 【DFS】nyoj 325 zb的生日
- nyoj 325 zb的生日 【DP】||【DFS】
- NYOJ 325 zb的生日【DFS】
- nyoj 325 zb的生日【dfs】
- NYOJ - 325 - zb的生日(dfs减枝,)
- NYOJ 325 zb的生日(DFS)
- zb的生日(dfs)
- NYOJ zb的生日
- nyoj zb的生日
- NYOJ zb的生日
- NYOJ zb的生日
- nyoj-zb的生日
- poj 3414 Pots(bfs)
- Codeforces Round #383 (Div. 2)E. Arpa’s overnight party and Mehrdad’s silent entering【二分图染色】
- 验证手机号码格式的正则表达式编写思路详解
- C#使用SQL存储过程完整流程
- Qt如何实现子部件在父部件上移动拖动
- nyoj zb的生日(DFS)
- Just a Hook
- 如何用好github中的watch、star、fork
- 快速开发各种Android 库列表(开发者)资源福利
- java笔记--关于线程同步(7种同步方式)
- 双机热备
- Android6.0 WMS(三) WMS窗口次序
- 算法训练 矩阵乘法
- 浅析Java中的集合包(ArrayList,LinkedList,Vector, Stack,HashSet,TreeSet,HashMap,TreeMap)