(step4.3.4)hdu 1258(Sum It Up——DFS)

来源:互联网 发布:网络电影分账截图 编辑:程序博客网 时间:2024/06/06 03:50

题目大意:输入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;}