体会Ank 和Cnk的不同选法(当前的数为index,每次从index后面的数里选取,为Cnk)(352,235,523只会选出来其中一种)
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int n,ans=0,sum;
int a[100];
bool vis[100];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void dfs(int index,int s,int cnt){
if(ans) return;
if(cnt==4){
ans=1;
return;
}
if(sum/4==s){ //当选出来一个边时从0开始继续选
dfs(0,0,cnt+1);
return;
}
for(int i=index;i<n;i++){
if(vis[i]==0){
vis[i]=1;
dfs(i+1,s+a[i],cnt); //dfs(i,s+a[i],cnt)也可以,因为vis[i]=1,所以肯定不会选i
vis[i]=0;
}
}
}
int main(){
cin>>n;
sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
if(sum%4) cout<<"No"<<endl;
else{
dfs(0,0,0);
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}