思路
如果没有说有多种答案的时候,按字母排序,那么就可以直接自定义一种先按dealine排序,再按cost time排序了。
用搜索思想,由于已经按字母排好序了,那么直接变为标号1为2,递归15层。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=20;
struct re
{
string name;
int d,c;
};
int use[maxn],ans,n;
re all[maxn];
int daan[maxn],fians[maxn];
void dfs(int ceng,int time,int pre)
{
if(ceng==n+1)
{ ans=min(pre,ans);
for(int i=1;i<=n;++i)fians[i]=daan[i];
return ;
}
for(int i=1;i<=n;++i)
{
if(use[i])continue;else{daan[ceng]=i;}
int now=time+all[i].c;
int get=pre+max(0,now-all[i].d);
if(get>=ans)continue;
use[i]=1;
dfs(ceng+1,now,get);
use[i]=0;
}
}
int main(void)
{
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
cin>>all[i].name>>all[i].d>>all[i].c;
}
ans=inf;
dfs(1,0,0);
printf("%d\n",ans);
for(int i=1;i<=n;++i)
cout<<all[fians[i]].name<<endl;
}
return 0;
}