首先按名称排序,10个选5个有252种选择,直接用回溯就可以.
#include <iostream>
#include <string>
#include <memory.h>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 10
struct athlete
{
char name[25];
int at,df;
bool operator<(const athlete &rhs )const{
return strcmp(name,rhs.name)<0;
}
}team[MAX];
vector<int>stak;
vector<int>attGuys;
bool chosen[MAX];
int defends,maxAtt,maxDef;
void backtrack(int curi){
if(stak.size()==5){
int def=0,attack=0;
for (int i=0;i<stak.size();++i)
{
attack+=team[stak[i]].at;
def+=team[stak[i]].df;
}
if(attack>maxAtt){
maxAtt=attack;
attGuys=stak;
maxDef=defends-def;
}else if(attack==maxAtt&&(defends-def)>maxDef){
maxDef=defends-def;
attGuys=stak;
}
return ;
}else if(curi==10)return;
stak.push_back(curi);
backtrack(curi+1);
stak.pop_back();
backtrack(curi+1);
}
int main(){
int t,cas=1;
scanf("%d",&t);
while (t--)
{
attGuys.clear();
memset(chosen,0,sizeof(chosen));
maxDef=0;
maxAtt=0;
defends=0;
for (int i=0;i<10;++i)
{
scanf("%s %d %d",&team[i].name,&team[i].at,&team[i].df);
defends+=team[i].df;
}
sort(team,team+10);
backtrack(0);
printf("Case %d:\n",cas++);
printf("(");
for (int i=0;i<attGuys.size();++i)
{
chosen[attGuys[i]]=1;
if(i>0)printf(", ");
printf("%s",team[attGuys[i]].name);
}
printf(")\n");
printf("(");
int cnt=0;
for (int i=0;i<10;++i)
{
if(!chosen[i]){
if(cnt++!=0)printf(", ");
printf("%s",team[i].name);
}
}
printf(")\n");
}
return 0;
}