简单的搜索——DFS(5)
题目来源:洛谷 P2036 [COCI2008-2009#2] PERKET
共八个测试点
题解
WA代码
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int n;
int s[15], b[15];
bool v[15];
int c = 1, k = 0;
int ans = inf;
void init()
{
memset(v, 0, sizeof(v));
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d%d", &s[i], &b[i]);
}
void dfs(int x)
{
if (ans == 0)
return;
if (x > n)
return;
for (int i = 1; i <= n; ++i)
{
if (v[i] == 0)
{
c *= s[i];
k += b[i];
ans = min(ans, abs(c - k));
v[i] = 1;
dfs(x + 1);
v[i] = 0;
c /= s[i];
k -= b[i];
}
}
}
int main()
{
init();
v[1] = 1;
dfs(1);
printf("%d", ans);
return 0;
}
错误分析
#44 行代码,v[1] = 1
表示一定会选到第一种调料。无法更改。
测试点通过情况
#1 ~ #4 WA
AC代码
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int n;
// s[x],b[x] 分别表示第 x 种调料的酸度和苦度
int s[15], b[15];
// 标记数组
bool v[15];
// c 表示总酸度,k 表示总苦度
int c = 1, k = 0;
int ans = inf;
// 初始化输入
void init()
{
memset(v, 0, sizeof(v));
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d%d", &s[i], &b[i]);
}
void dfs(int x)
{
// 当 ans == 0 时,已经到达最小 ans
if (ans == 0)
return;
// 当 x > n 时,已经没有调料可选
if (x > n)
return;
for (int i = 1; i <= n; ++i)
{
if (v[i] == 0)
{
c *= s[i];
k += b[i];
ans = min(ans, abs(c - k));
v[i] = 1;
dfs(x + 1);
// 回溯
v[i] = 0;
c /= s[i];
k -= b[i];
}
}
}
int main()
{
init();
dfs(1);
printf("%d", ans);
return 0;
}