杭电1258 Sum it Up DFS 搜索

来源:互联网 发布:大数据 文化产业 编辑:程序博客网 时间:2024/06/16 04:49
题目描述:给你一个数t作为最后等式的和,并给你一组数a[i](i<12)作为等式的加数,每个加数最多只能使用一次,要求输出所有满足条件(加数从大到小输出)的等式,并且不能重复。
例:t=4. a[]={4,3,2,2,1,1}
输出 4,3+1,2+2,2+1+1

解题思路:题目要求输出从大到小输出,所以可以先给所有的数进行降序排序。数据的规模很小,所以可以用暴力搜索。搜索过程中,为了避免重复输出,需要记录前一层搜索的起点,下一层递归搜索的起点不能与前一层记录的点一样

#include <iostream>#include <algorithm>#include <stdio.h>using namespace std;int t,n;int a[20];int save[20]; int index;int used[20];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;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];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;}


0 0
原创粉丝点击