https://blog.youkuaiyun.com/hpuhjh/article/details/47291099
我要舔屏幕了,这个代码太好了,又简洁又容易懂。
为什么这个DFS 写出了 背包问题 的感觉~
#include<bits/stdc++.h>
using namespace std;
int a[110];
int b[110];
int vis[100000];
int flag=0;
int n;
void dfs(int pos,int ans,int sum,int num) // pos 是a的下标, ans 是b的下标,sum是当前的和, num是加数有几个
{
if(pos>=n) return ; // a数组 在加法的左边全用上了。
if(ans>num) return ; // b的下标超过了 加数上限
if(sum>a[n-1]) return ; //和 超过了a数组最大值
if(ans==num && vis[sum] ){// 正好ans 和 num 形成错位, ans =5 时,b【5】 还没有存东西,但是加数已经有5个了。
flag=1;
cout<<b[0];
for(int i=1;i<ans;i++)
cout<<'+'<<b[i];
cout<<'='<<sum<<endl;
return;
}
b[ans]=a[pos]; // b里面保存起要用的 a数组里的元素。
dfs(pos+1,ans+1,sum+a[pos],num);// 用a[pos]。
dfs(pos+1,ans,sum,num);// 不用a[pos]。 这两个尾递归 有点 0 - 1背包的味道
}
int main()
{
int t;
cin>>t;
while(t--)
{
flag=0;
memset(vis,0,sizeof vis);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
vis[a[i]]++;
}
sort(a,a+n);
for(int i=2;i<n;i++)
dfs(0,0,0,i);
if(!flag)
cout<<"Can't find any equations."<<endl;
cout<<'\n';
}
return 0;
}