杭电1258 Sum it Up DFS 搜索

19 篇文章 0 订阅
题目描述:给你一个数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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值