hdu1015

嘿嘿,题目罗嗦了半天,其实意思很简单,就是给定一个目标值target,再给你一个备选字符串(5~12个字符),要你在这个字符串里选5个出来,满足题中给定的等式,并且你选择的这5个字符组成的字符串必须是所有可能情况中按字典序最大的情况。

      简单分析下就可以看出,就是一个组合问题,问题解的最大规模就是125,就是12*11*10*9*8*7,而最小规模是55,所以应该用枚举法就可以搞定。

不过,枚举之前先排个序,就可以保证输出的是符合要求的最大的那个了

#include<iostream>
#include<string>
using namespace std;
int cmp(const void* a,const void* b)
{
	return *(int*)b-*(int*)a;
}
int main()
{
	int n,a[15],i,flag;
	char s[15];
	while(cin>>n>>s)
	{
		if(n==0&&!strcmp(s,"END"))
			break;
		for(i=0;s[i]!='\0';i++)
			a[i]=s[i]-'A'+1;
		qsort(a,i,sizeof(a[0]),cmp);
		int len=i;
		flag=0;
		for(int i=0;i<len;i++)
		{
			for(int j=0;j<len;j++)
			{
				if(i==j)continue;
				for(int k=0;k<len;k++)
				{
					if(k==i||k==j)continue;
					for(int l=0;l<len;l++)
					{
						if(l==k||l==i||l==j)continue;
					    for(int m=0;m<len;m++)
						{
							if(m==l||m==i||m==j||m==k)continue;
							if(a[i]-a[j]*a[j]+a[k]*a[k]*a[k]-a[l]*a[l]*a[l]*a[l]+a[m]*a[m]*a[m]*a[m]*a[m]==n)
							{
									flag=1;
									printf("%c%c%c%c%c\n",a[i]+'A'-1,a[j]+'A'-1,a[k]+'A'-1,a[l]+'A'-1,a[m]+'A'-1);
									break;
							}
						}
						if(flag)break;
					}
					if(flag)break;
				}
				if(flag)break;
			}
			if(flag)break;
		}
		if(!flag)
			printf("no solution\n");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2124322.html