题目连接:https://www.luogu.com.cn/problem/P2392
代码如下;
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[4][21];
int miner;
int l = 0, r = 0;
void dfs(int i, int k) {
if (k > a[i][0]) {
miner = min(miner, max(l, r));
return;
}
l += a[i][k];
dfs(i, k + 1);
l -= a[i][k];
r += a[i][k];
dfs(i, k + 1);
r -= a[i][k];
}
int main() {
int sum = 0;
for (int i = 0; i < 4; i++) {
cin >> a[i][0];
}
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= a[i][0]; j++) {
cin >> a[i][j];
}
miner = 1200;
l = 0;
r = 0;
dfs(i, 1);
sum += miner;
}
cout << sum;
return 0;
}
这题其实并不算难,对于每门科目深搜枚举所有情况取最小的时间即可。但在写代码的过程中我遇到了些麻烦…
题目中的miner和l跟r为什么是在main程序中的循环写呢?不能够在dfs程序中的开头写写上 miner=1200,l=0,r=0嘛?
void dfs(int i, int k) {
miner=1200;
l=0,r=0;
if (k > a[i][0]) {
miner = min(miner, max(l, r));
return;
}
l += a[i][k];
dfs(i, k + 1);
l -= a[i][k];
r += a[i][k];
dfs(i, k + 1);
r -= a[i][k];
}
我的内心认为这样写没有什么差别…
但是这是错的。其实细心一点就能发现,dfs中间有递归的过程,每一次递归重新调用时都会重新初始化miner和l跟r,所以会带来问题。我们只想在进行每个科目的dfs前只进行一次初始化,在dfs过程中可不能初始化呢~