#include <bits/stdc++.h>
using namespace std;
int s[5];
int a[5][25]={0};
int l[5]={0},r[5]={0};
int k[5];
void dfs(int x,int y){
if(y>s[x]||x>4){
int f=max(l[x],r[x]);
k[x]=min(f,k[x]);
return ;
}
l[x]+=a[x][y];
dfs(x,y+1);
l[x]-=a[x][y];
r[x]+=a[x][y];
dfs(x,y+1);
r[x]-=a[x][y];
}
int main(){
cin>>s[1]>>s[2]>>s[3]>>s[4];
for(int i=1;i<=s[1];i++){
cin>>a[1][i];
}
for(int i=1;i<=s[2];i++){
cin>>a[2][i];
}
for(int i=1;i<=s[3];i++){
cin>>a[3][i];
}
for(int i=1;i<=s[4];i++){
cin>>a[4][i];
}
memset(k,40000,sizeof(k));
dfs(1,1);
int ans=0;
for(int i=1;i<=4;i++){
dfs(i,1);
}
for(int i=1;i<=4;i++){
ans+=k[i];
}
cout<<ans<<endl;
return 0;
}
这个是第一段,我把dfs函数一次只处理一科的习题,然后用for循环循环4科,然后ac了。 但是下面这一段代码好像就不行。
#include <bits/stdc++.h>
using namespace std;
int s[5];
int a[5][25]={0};
int l[5]={0},r[5]={0};
int k[5];
void dfs(int x,int y){
if(y>s[x]||x>4){
int f=max(l[x],r[x]);
k[x]=min(f,k[x]);
if(x>=4){
return ;
}else{
dfs(x+1,1);//如果x<4,x加一来处理下一个学科
}
return ;
}
l[x]+=a[x][y];
dfs(x,y+1);
l[x]-=a[x][y];
r[x]+=a[x][y];
dfs(x,y+1);
r[x]-=a[x][y];
}
int main(){
cin>>s[1]>>s[2]>>s[3]>>s[4];
for(int i=1;i<=s[1];i++){
cin>>a[1][i];
}
for(int i=1;i<=s[2];i++){
cin>>a[2][i];
}
for(int i=1;i<=s[3];i++){
cin>>a[3][i];
}
for(int i=1;i<=s[4];i++){
cin>>a[4][i];
}
memset(k,40000,sizeof(k));
dfs(1,1);
int ans=0;
for(int i=1;i<=4;i++){
ans+=k[i];
}
cout<<ans<<endl;
return 0;
}
第二段代码我打算用一个dfs函数来处理四科,想法是处理完一科以后,x就会加一处理下一科,但是tle了8个样例,请问第二段代码比第一段慢在了哪里,求各位大佬解答