HDU-1711:Sum It Up

本文介绍了一种使用DFS算法解决等式组合问题的方法,并实现了等式的判重功能。通过对输入数字进行全排列组合,利用multiset和set数据结构记录有效等式,最后输出所有不重复的有效等式组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*DFS,这道题主要是去掉重复的等式,网上看了大神的方法- -,说是用叶子来判重- -。表示看不懂,回头再去理解,土方法,全部找出来再判断*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#include<vector>
#define N 14
using namespace std;

bool Cmp(const int &a,const int &b)
{
	return a>b;
}
int lis[N];
int vis[N];
int n,t,find,mark;
//multiset是允许重复元素的,用来存放一组等式
typedef multiset<int,greater<int> > Elem;
//set不允许重复元素,用来等式判重
set<Elem> se;
void dfs(int len,int v,int index)
{
	int i;
	if (len==t)
	{
		Elem tmp;
		for (i=0;i<n;i++)
		{
			if (vis[i])
				tmp.insert(lis[i]);
		}
		se.insert(tmp);
		return;
	}
	for (i = v;i<n;i++)
	{
		if (lis[i]+len<=t && !vis[i])
		{
			vis[i] = 1;	//表示没有用过
			dfs(lis[i]+len,i,index+1);
			vis[i] = 0;//回溯还原
		}
	}
}
int main()
{
	int i;
	
	while(cin>>t>>n && n)
	{
		for (i=0;i<n;i++)
			cin>>lis[i];
		sort(lis,lis+n,Cmp);
		memset(vis,0,sizeof(vis));
		lis[N-1] = 1;
		cout<<"Sums of "<<t<<":"<<endl;
		dfs(0,0,0);
		if(se.empty())cout<<"NONE"<<endl;
		else
		{
			//要用reverse_iterator遍历器。上面放入的时候是反着放的
			for(set<Elem >::reverse_iterator it1= se.rbegin();it1 != se.rend();it1++) 
			{  
				int flag=1;
				for(Elem::const_iterator it2=it1->begin();it2 != it1->end();it2++)  
					//必须要用const_iterator,否则编译不通过  
				{  
					cout<<(flag==0?flag=0,"":"+");		  
					cout<<*it2;  
				}  
				cout<<endl;  
			}
		}
		se.clear();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值