题目大意:给出一些数字,求出某几个数字之和等于给出的某一个数字 ,并按照要求输出
解决: 排序,dfs
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num[35];
bool flag;
int res[35],n;
void dfs(int start,int dest_deep,int current_deep,int current_sum)
{
if(current_deep==dest_deep)
{
if(binary_search(num,num+n,current_sum))
{
printf("%d",res[0]);
for(int i=1;i<dest_deep;i++)
printf("+%d",res[i]);
printf("=%d\n",current_sum);
flag=true;
}
}
else
{
for(int i=start;i<n-1;i++)
{//下边这个if判断使得超时的程序,变为150ms,差别就是这么明显
if(current_sum+num[i]<=num[n-1])
{
res[current_deep]=num[i];
dfs(i+1,dest_deep,current_deep+1,current_sum+num[i]);
}//下边这个else break语句使得删除后310ms变为150ms,剪枝是多么重要啊
else break;
}
}
}
int main()
{
int i,j,k,icase;
scanf("%d",&icase);
while(icase--)
{
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&num[i]);
sort(num,num+n);
flag=false;
for(int step=2;step<n;step++)
{//step表示多少个数的和,从2......n-1
dfs(0,step,0,0);
}
if(!flag)puts("Can't find any equations.");
printf("\n");
}
// system("pause");
return 0;
}
浙公网安备 33010602011771号