太菜了。。。感谢大佬抬我
题意: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; }