题目意思
给出的n块石头,可以把他变成黄金,增加a的财富,减少b的魔法,也可以不变黄金,增加c的魔法,减少d的财富。
问如何安排才可以使得最后的财富最大。
n小于等于15。
解题思路
先看题目范围,本题的n非常非常小,很明显就是叫你二进制枚举。学聪明点,先观察数据范围。
那么二进制枚举每个物品拿和不拿最终的取值取到最大就可。当然用系统的函数栈写的dfs应该会更香一点点。
#include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { int s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } const int N = 20; int a[N], b[N], c[N], d[N]; ll ans, sum1, sum2; int n; void dfs(int x) { if (x > n) { if (sum1 * sum2 > ans) ans = sum1 * sum2; return; } for (int i = 1; i <= 2; ++i) { ll temp1 = sum1; ll temp2 = sum2; if (i & 1) { sum1 += a[x]; sum2 -= b[x]; if (sum2 < 0) sum2 = 0; } else { sum2 += c[x]; sum1 -= d[x]; if (sum1 < 0) sum1 = 0; } dfs(x + 1); sum1 = temp1; sum2 = temp2; } } int main() { n = read(); for (int i = 1; i <= n; ++i) a[i] = read(), b[i] = read(), c[i] = read(), d[i] = read(); dfs(1); printf("%lld\n", ans); return 0; }