题目大意:每次有两种选择,第一种是得到金钱,消耗魔法值。第二种是得到魔法值,消耗金钱。金钱和魔法值不够消耗时也可以消耗,该值置为0。求金钱*魔法值的最大值。
对于20%的数据,1≤n≤2
对于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;
}