杭電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;
}


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