题目意思

给出的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;
}