链接:https://ac.nowcoder.com/acm/contest/5803/B
来源:牛客网

题目描述
赛时提示:魔法值和财富值初始为0

帕秋莉掌握了一种金属性魔法
她决定去捡一些石头,施展点石成金魔法

帕秋莉将捡到的n块石头排成一排,并决定将一些石头点为黄金

对于第i块石头,如果将其变为黄金,会增加ai的财富,消耗bi的魔法(需要说明的是,就算魔法值不够,也可以操作,操作后魔法值归零)

否则,帕秋莉将会回复ci的魔法,但减少di的财富(财富值同理,可以无限制减少)

帕秋莉想知道,按照1-n的顺序以此操作每块石头,如何决策,可以使自己最后的收益值最大
只需要输出最大收益
收益值=财富值*魔法值

(提示:数值不会变为负数,即任何时候,如果数值小于了0,它会立即变为0)

输入描述:
第一行一个整数n
接下来n行,每行四个数,分别代表对应石头的a,b,c,d值
输出描述:
一个整数表示答案
示例1
输入
复制
2
1926 817 2003 627
1949 1001 1234 4321
输出
复制
1952898
备注:
对于20%的数据,1≤n≤2
对于100%的数据,1≤n≤15,0≤ai,bi,ci,di≤1,000,000

题意:有n步操作,每步操作,你可以选择加财富减蓝,或者加蓝减财富。当然任何情况下财富和蓝都大于等于0.就是出现负数,就是0.问最后财富*蓝最大值。

题解:知识点:类似2进制枚举,dfs
我们可以把他像成一共有n位 每一位可以选择0或1,0是+财富-蓝,1是加蓝减财富
以为数据量不大我们可以直接暴搜一下,找到最大值。

代码:

#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
using namespace std;
typedef pair<ll,ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=2e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=998244353;
const int MOD=10007;

inline int read() {
    int x=0;
    bool t=false;
    char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}

/*priority_queue<ll , vector<ll> , greater<ll> > mn;//上  小根堆         小到大 
priority_queue<ll , vector<ll> , less<ll> > mx;//下       大根堆      大到小
map<ll,ll>mp;*/

ll n,m,t,l,r,p;
ll sum,ans,res,cnt,flag,maxx,minn;
bool isprime[maxn];
ll a[20],b[20],c[20],d[20];
ll dis[maxn],vis[maxn];
ll dp[1010][1010];
string str,s;

void dfs(ll h,ll l,ll num){
    if(num==n+1){
        maxx=max(maxx,h*l);
        return;
    }
    dfs(max(h-d[num],(ll)0),l+c[num],num+1);
    dfs(h+a[num],max(l-b[num],(ll)0),num+1);
}


int main(){
     cin>>n;
    for(int i=1;i<=n;i++)
        sf("%lld%lld%lld%lld",&a[i],&b[i],&c[i],&d[i]);

    dfs(0,0,1);
    cout<<maxx<<endl;
    return 0;
}