思路
如果没有说有多种答案的时候,按字母排序,那么就可以直接自定义一种先按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;
}