题目大意:每次有两种选择,第一种是得到金钱,消耗魔法值。第二种是得到魔法值,消耗金钱。金钱和魔法值不够消耗时也可以消耗,该值置为0。求金钱*魔法值的最大值。
对于20%的数据,1≤n≤2
对于100%的数据,1≤n≤15,0≤ai,bi,ci,di≤1,000,000
对于100%的数据,1≤n≤15,0≤ai,bi,ci,di≤1,000,000
题目思路:每块石头有两种选择,变成黄金(财富+a, 魔法-b)和不变成黄金(财富-d, 魔法+c),取两者的最大值。观察题目所给的范围,n值较少,所以可以直接进行dfs的搜索。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 20; typedef long long ll; ll a[N], b[N], c[N], d[N]; int n; ll dfs(int num, ll money, ll mofa){ if(num == n + 1){ return money * mofa; } ll temp = mofa - b[num]; ll res = dfs(num + 1, money + a[num], temp < 0 ? 0 : temp); temp = money - d[num]; res = max(res, dfs(num + 1, temp < 0 ? 0 : temp, mofa + c[num])); return res; } int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++){ scanf("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]); } ll res = dfs(1, 0, 0); printf("%lld\n", res); return 0; }