太菜了。。。感谢大佬抬我

题意: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;
 }