题目大意:输入t,n,接下来有n个数组成的一个序列。输出总和为t的子序列

解题思路:DFS

代码如下(有详细的注释):

#include <iostream>
#include <algorithm>
using namespace std; /**
* t: 指定的和
* n: 给出的数的个数
* sign : 用来标记是否有解
* index :结果序列中元素的个数
* a[] :用来存储给出的数
* save[] :用来保存结果序列
*
*/
int t, n;
int a[20];
int save[20];
int index;
int sign; //降序排列
int cmp(const int &a, const int& b) {
return a > b;
} void dfs(int k, int sum) {
//如果当前搜索到的和>指定和
if (sum > t) {
return;
}
//如果当前搜索到的和 == 指定和
if (sum == t) {
sign = 1; //将sign标记为1,表示有解
for (int i = 0; i < index - 1; i++) {
cout << save[i] << "+";
}
cout << save[index - 1] << endl;
return;
} //遍历状态
int last = -1;
for (int i = k + 1; i <= n; i++) {
if (a[i] != last) { //当前的数不能跟上一次搜索的起点的数值一样,不然会造成重复
save[index++] = a[i];//将a[i]放进结果序列中
last = a[i]; //last保存当前搜索的起点
dfs(i, sum + a[i]);
index--;
}
}
} int main() {
int i;
while (cin >> t >> n, t + n) {
index = 0;
sign = 0;
for (i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1, cmp); //降序排序
printf("Sums of %d:\n", t);
dfs(0, 0);
if (!sign) {
cout << "NONE" << endl;
}
}
return 0;
}

最新文章

  1. C/C++头文件使用 #ifndef #define #endif 的原因
  2. RabbitMQ 参数们的Power &ldquo;续&rdquo;
  3. 根据UUID和MD5, 生成可以用作Token的字符串
  4. 十八、【开源】EnterpriseFrameWork框架核心类库之Winform控制器
  5. source命令
  6. spring的CXF远程服务
  7. Hunters
  8. ztree学习笔记(一)
  9. 【IP限制】验证是否限制了境外IP访问权限
  10. java_自定义标签运行原理
  11. Python:decorator [转]
  12. 浅析AnyCast网络技术
  13. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
  14. Python3学习笔记25-logging模块
  15. (转)explain、db2exfmt 命令的使用:文本输出执行计划
  16. vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介
  17. redis window 安装测试--记录
  18. bzoj 3653
  19. Opengl的TOOL收集
  20. HTML页面参数的传递与获取

热门文章

  1. Hive内表和外表的区别
  2. using 语句中使用的类型必须可隐式转换为“System.IDisposable”
  3. java &amp; xml parser
  4. 【转载】IE6 PNG透明终极解决方案(打造W3Cfuns-IE6PNG最强帖)
  5. Java 8 VM GC Tunning Guide Charter 5
  6. git/github在windows上使用
  7. MVC4 错误: 检测到有潜在危险的 Request.Form值
  8. uva 11825
  9. mysql_fetch_row,mysql_fetch_array,mysql_fetch_object,mysql_fetch_assoc区别
  10. linux源代码阅读笔记 高速缓冲区管理