您的位置:首页 > 其它

ZOJ_1204_AdditiveEquations

2015-07-23 15:39 197 查看
第一个dfs的题目

就是求一个没有重复的正整数的序列能组成的加法算式并输出

一边是几个加数,另一边是和。

排列顺序每个式子数字由小到大

加数个数由少到多(这个还坑了我一下)

感觉要写dfs一定要理清楚思路不然写代码会很卡

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

const int M=31;
int s[M];         //存储输入
int l[M];         //目前搜索了的加数

//int in=0;

void showe(int nu,int sp)
{
for(int i=0;i<nu-1;i++)
printf("%d+",l[i]);
printf("%d=%d\n",l[nu-1],sp);
}

int dfs(int tot,int nu,int maxn,int p,int m)   //tot之前的和 nu之前有的数 maxn最大要几个数,p前一个位置,m数字个数
{
//   in++;cout<<in<<" "<<p<<" "<<tot<<" "<<nu<<endl;cout<<l[0]<<" "<<l[1]<<endl;
if(p>=m-1)
return 0;
if(nu==maxn)
{
for(int i=p+1;i<m;i++)
if(tot==s[i])
{
showe(nu,s[i]);
return 1;
}
return 0;                         //这个return能减掉不少 ,第一次超时应该就是因为这个
}
int f=0;
for(int i=p+1;i<m;i++)
{
l[nu]=s[i];
if(dfs(tot+s[i],nu+1,maxn,i,m))
f=1;
}
return f;
}

int main()
{
int n;
int m;
int f;
scanf("%d",&n);
while(n--)
{
f=0;
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&s[i]);
sort(s,s+m);

int tmp=s[m-1],nmax=0;                            //这个也能排除一些根本不可能出现的加数个数
while(tmp>=0)                                     //但是如果有极限数据出现这个也没什么用
{
tmp-=s[nmax];
nmax++;
}
for(int i=2;i<=nmax-1;i++)
{
if(dfs(0,0,i,-1,m))
f=1;
}
if(!f)
printf("Can't find any equations.\n");
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: