hdu1074

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

发布了114 篇原创文章 · 获赞 22 · 访问量 6744

猜你喜欢

转载自blog.csdn.net/qq_43235540/article/details/103812505