这是一道dfs的题,第一眼看到还以为是一道贪心
比赛时的提示:初始魔法值和初始财富值都为0
注意这道题的数据范围,有两点需要注意:
1.n比较小,可以使用dfs直接搜
2.a,b,c,d的值较大,所以要开long long
对于每件物品 ,我们直接暴搜,枚举他要不要把这块石头变成金子
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1e2;
typedef long long ll;
ll ans, n;
//财富+a 魔法-b // 魔法+c 财富-d
ll a[maxn], b[maxn], c[maxn], d[maxn];
ll max(ll x, ll y) {
if (x > y) return x;
else return y;
}
void dfs(ll wealth, ll magic, ll num) {
if (num == n + 1) {
ans = max(ans, magic * wealth);
return;
}
dfs(wealth + a[num], max(magic - b[num], 0), num + 1);//点它
dfs(max(wealth - d[num], 0), magic + c[num], num + 1);//不点
}
int main() {
cin >> n;
for (ll i = 1; i <= n; i++)
cin >> a[i] >> b[i] >> c[i] >> d[i];
dfs(0, 0, 1);
cout << ans << endl;
return 0;
}