这题需要找到每一科所有题目放在左右脑算的最短时间,因此使用深搜
第二次做这道题的大概思路:
1、for循环四个科目,每一层中进行dfs(当前已经加过的题目的数量,每个科目的题量)。
if(到达最大值){
min = min(min,max(left, right));
return;
}
left+=a[i][j];
dfs(x+1, y);
left-=a[i][j];
right+=a[i][j];
dfs(x+1,y);
right-=a[i][j];
3、for循环完毕后输出ans。
#include<bits/stdc++.h>
using namespace std;
int Left,Right,minn,ans;
int s[5];
int a[21][5];
void dfs(int x,int y){
if(x>s[y]){
minn=min(minn,max(Left,Right));
return;
}
Left+=a[x][y];
search(x+1,y);
Left-=a[x][y];
Right+=a[x][y];
search(x+1,y);
Right-=a[x][y];
}
int main(){
cin>>s[1]>>s[2]>>s[3]>>s[4];
for(int i=1;i<=4;i++){
Left=Right=0;
minn=19260817;
for(int j=1;j<=s[i];j++)
cin>>a[j][i];
dfs(1,i);
ans+=minn;
}
cout<<ans;
return 0;
}