Problem:算式等式
Description
给你N个数字,每个数字均不相同,你可以取其中任意个数字相加,如果所得到的结果在给出的数列
中也能找到,则输出这个等式
Input
第一行一个数字N
接下来N个数字
Output
输出你找到的等式,注意看样例的输出格式
Sample Input
6
1 3 5 7 8 9
Sample Output
1+7=8
1+8=9
3+5=8
1+3+5=9
这道题其实很简单难到樱花的是这个奇妙的输出得用到分支限界,是不是听起来很棒?所以开始我们的代码之旅吧:
#include<bits/stdc++.h>//可爱的万能头
using namespace std;
int n,lim;//一个输入,一个判断输出
int a[100],ans[100];//一个存,一个输出
void dfs(int dep,int pre,int sum)//搜索
{
if(dep==lim+1)//如果超过的话
{
bool ok=false;//先赋初值
for(int i=1;i<=n;i++)
{
if(sum==a[i])//相等的话
{
ok=true;//为真
break;//退出
}
}
if(ok==true)//接着上面的
{
for(int i=1;i<=lim;i++)
{
if(i<lim)//就是这耗了我一下午
{
cout<<ans[i]<<"+";//来一个放一个
}
else cout<<ans[i]<<"="<<sum<<endl;//最后一个最后出
}
}
return ;
}
for(int i=pre;i<=n;i++)
{
if(sum+a[i]<=a[n])
{
ans[dep]=a[i];
dfs(dep+1,i+1,sum+a[i]);//寻找下一个
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];//输入
}
for(lim=2;lim<=n-1;lim++)
{
dfs(1,1,0);//搜索
}//好像少打了个return 0,没事问题不大
}
好了,其实这道题十分简单,希望大家能理解。
最令人开心的环节到了
大家都懂:
#include<bits/stdc++.h>
using namespace std;
int n,lim;
int a[100],ans[100];
void dfs(int dep,int pre,int sum)
{
if(dep==lim+1)
{
bool ok=false;
for(int i=1;i<=n;i++)
{
if(sum==a[i])
{
ok=true;
break;
}
}
if(ok==true)
{
for(int i=1;i<=lim;i++)
{
if(i<lim)
{
cout<<ans[i]<<"+";
}
else cout<<ans[i]<<"="<<sum<<endl;
}
}
return ;
}
for(int i=pre;i<=n;i++)
{
if(sum+a[i]<=a[n])
{
ans[dep]=a[i];
dfs(dep+1,i+1,sum+a[i]);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(lim=2;lim<=n-1;lim++)
{
dfs(1,1,0);
}
}
花花也想像摸鱼酱一样,希望大家支持!!!
蟹蟹!!!