杭电1258 Sum it Up DFS 搜索

题目描述:给你一个数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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章