您的位置:首页 > 其它

HDU 1074 状压DP

2014-03-12 16:18 232 查看
状态压缩DP 模板

感觉叫 状态压缩搜索更合适。。。

#include "iostream"
#include "algorithm"
const int inf=0x7fffffff;

struct comp
{
char name[101];
int et,cost;
} data[21];
int b[21],hash[21];
int sum[1<<16];// 存储代价
char out[21][101],str[21][101];
int n;

void dp(int start,int cost,int num,int works)// 起始时间,代价,完成数,状态压缩值
{
int i,temp;
if (num==n)
{
if (cost==sum[works])
{
for (i=0;i<n;i++)
strcpy(out[i],str[i]);
}
return ;
}

for (i=1;i<=n;i++)
if (hash[i]==0)
{
hash[i]=1;
temp=start+data[i].cost-data[i].et;
if (temp<0) temp=cost;
else temp+=cost;
works+=b[i];

if (sum[works]>temp)
{
sum[works]=temp;
strcpy(str[num],data[i].name);
num++;
dp(start+data[i].cost,temp,num,works);
num--;
}

hash[i]=0;
works-=b[i];
}
}

int main()
{
int i,ans,t;
b[0]=1;
for (i=1;i<=16;i++)
b[i]=b[i-1]<<1;

scanf("%d",&t);

while (t--)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%s%d%d",data[i].name,&data[i].et,&data[i].cost);

memset(hash,0,sizeof(hash));
for (i=0;i<(1<<16);i++)
sum[i]=inf;

ans=0;
for (i=1;i<=n;i++)
ans+=b[i];

dp(0,0,0,0);
printf("%d\n",sum[ans]);

for (i=0;i<n;i++)
printf("%s\n",out[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: