poj 1564 Sum It Up (DFS+ 去重+排序)
2015-08-18 16:42
477 查看
http://poj.org/problem?id=1564
该题运用DFS但是要注意去重,不能输出重复的答案
两种去重方式代码中有标出
第一种if(a[i]!=a[i-1])意思是如果这个数a[i]和上一个数相同,那么记录数组的同一个位置就没有必要再放入这个数。例如:4 3 3 2构成和是7,b数组的第二个位置放了3,则后面的那个3就没有必要再放入记录数组的第二个位置了。(可能会放到后面的位置)...
该题运用DFS但是要注意去重,不能输出重复的答案
两种去重方式代码中有标出
第一种if(a[i]!=a[i-1])意思是如果这个数a[i]和上一个数相同,那么记录数组的同一个位置就没有必要再放入这个数。例如:4 3 3 2构成和是7,b数组的第二个位置放了3,则后面的那个3就没有必要再放入记录数组的第二个位置了。(可能会放到后面的位置)...
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<vector> #include<algorithm> #define N 110 using namespace std; int a , b ; int t, n, f; int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } void DFS(int k, int j, int sum) { int i; if(sum == t) { f = 1; qsort(b, j, sizeof(b[0]), cmp); printf("%d", b[0]); for(i = 1 ; i < j ; i++) printf("+%d", b[i]); printf("\n"); return ; } for(i = k ; i < n ; i++) { if(a[i] != a[i - 1] || i == k) { b[j] = a[i]; DFS(i + 1, j + 1, sum + a[i]); } /*if(sum + a[i] <= t) { b[j] = a[i]; DFS(i + 1, j + 1, sum + a[i]); while(a[i] == a[i + 1] && i + 1 < n) i++;//去重 }*/ } } int main() { int i; while(scanf("%d%d", &t, &n), t + n) { f = 0; for(i = 0 ; i < n ; i++) scanf("%d", &a[i]); qsort(a, n, sizeof(a[0]), cmp); printf("Sums of %d:\n", t); DFS(0, 0, 0); if(f == 0) printf("NONE\n"); } return 0; }
相关文章推荐
- UIScrollView循环滚动图片
- codeforces427c-Checkposts
- java集合中的fail-fast机制
- Laravel Upload Manager
- RHCS概念
- 静态扫描-Godeyes for ios
- php数组——将服务端的文件载入数组并显示成web页面
- Java 其他对象 IO流 字符流--18
- UVA 12657 Boxes in a Line 【双向链表】
- 利用strlen和sizeof求取字符串长度注意事项
- gcc 关于 -lpcap 参数
- Delphi 版本号(D1到XE6),发现一个delphi.wikia.com网站
- javascript函数 第14节
- 前端攻城狮学习笔记九:让你彻底弄清offset
- 如何解决局域网中Windows防火墙不能访问Oracle问题!
- CAD教程--嵌入表格
- Android中使用Handler造成内存泄露
- HDU 5399 Too Simple(过程中稍微用了一下dfs)——多校练习9
- 远在美国的凤姐为何选择回国理财?
- poj3279 Fliptile (dfs搜索)