太菜了。。。感谢大佬抬我
题意:n个装备,每个装备有k种,一个人最多只能选一种装备的一个,每个装备有四个属性a,b,c,d,DMG=(100+∑i∈Sai)(100+∑i∈Sbi)(100+∑i∈Sci)(100+∑i∈Sdi),化简为DMG=100^4+100^3(a+b+c+d)+100^2(ab+ac+ad+bc+bd+cd)+100(abc+abd+acd+bcd)+abcd,求穿上每种装备后的DMG最大值。
思路:就dfs搜一下
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <unordered_map>
typedef long long ll;
using namespace std;
typedef struct{
int a;
int b;
int c;
int d;//四种属性值
}node;
ll ans;
vector<node> e[55];//例如样例,e[n]就代表第n种装备,e[n][0]代表第二种装备的第一个 依此类推
vector<int> v;
int flag[55];
ll cal(ll a, ll b, ll c, ll d)
{
return (100 + a) * (100 + b) * (100 + c) * (100 + d);
}
void dfs(int t,int j,ll a,ll b,ll c,ll d)
{
for (auto x : e[t])//遍历
{
a += x.a, b += x.b, c += x.c, d += x.d;
if (j==v.size()-1)//最后一种装备
{
ans = max(ans, cal(a, b, c, d));
}
else {
dfs(v[j+1],j+1, a, b, c, d);
}
a -= x.a, b -= x.b, c -= x.c, d -= x.d;// 避免叠加,枚举这一种装备的其它装备前减去当前装备的值
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;cin >> T;
while(T--)
{
memset(flag,0,sizeof(flag));
int n, k; cin >> n >> k;
v.clear();
for(int i=1;i<=k;i++) e[i].clear();//多组数据每循环完一次记得清空vector
for(int i = 1; i <= n; i++)
{
node a;int t;
cin >> t >> a.a >> a.b >> a.c >> a.d;
if(!flag[t]) v.push_back(t);//记录有几种装备
flag[t]=1;
e[t].push_back(a);
}
ans = 0;
dfs(v[0],0,0,0,0,0);
cout << ans << endl;
}
return 0;
} 
京公网安备 11010502036488号