题目大意:
小A去饭店里吃饭有n道菜,小A需要吃m道才才能满足,每道菜都有自己的满意度
,有k个联系。u v c 代表先吃u 紧接着吃v 会额外获得c的满意值。
此题与poj3311类似。:TSP
问题分析:
统计所有状态中 1的数量等于m的最大d(statue,i)值。
i代表当前在吃第几道菜,statue代表吃了多少菜。
分析借鉴:poj3311
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll d[1<<20][20];
int nu[1<<20];
ll val[1<<20];
ll dis[20][20];
int Num(int i)
{
int r = 0;
while(i)r+=(i%2),i/=2;
return r;
}
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
ll res = 0,c;
int t = 1<<n, u, v;
for(int i=1; i<=n; i++)
{
scanf("%lld",&val[i]);
//if()
}
for(int i=0; i<t; i++)
{
nu[i]=Num(i);
}
memset(dis,0,sizeof(dis));
for(int i=0; i<k; i++)
{
scanf("%d%d%lld",&u,&v,&c);
dis[u][v]=c;
}
memset(d,-1,sizeof(d));
d[0][0]=0;
for(int r=0; r<t; r++)
{
for(int i=1; i<=n; i++)
{
if(r&(1<<(i-1)))
{
int ts = r-(1<<(i-1));
if(ts == 0)
{
d[r][i]=val[i];
}
for(int j=1; j<=n; j++)
{
if((ts&(1<<(j-1)))&&d[ts][j]!=-1)
{
d[r][i]=max(d[r][i],d[ts][j]+dis[j][i]+val[i]);
}
}
}
if(nu[r] == m)
res = max(res,d[r][i]);
}
}
printf("%lld\n",res);
}
}