您的位置:首页 > 编程语言 > Go语言

HDU3339--In Action(最短路+0-1背包)

2014-01-25 20:43 453 查看
先用最短路求出0到i点的最短距离,然后再用0-1背包做。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 999999999
#define M 105
using namespace std;

int main()
{
int map[M][M],p[M],dp[M*M];
int n,m,t,i,j,k,sum,ave;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
map[i][j]=INF;
}
}
while(m--)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
map[u][v]=map[v][u]=min(map[u][v],d);
}
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i]);
sum+=p[i];
}
ave=sum/2;
for(k=0;k<=n;k++)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
}
int temp=0;
for(i=1;i<=n;i++)
{
if(map[0][i]<INF-10)
temp+=map[0][i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=temp;j>=map[0][i];j--)
{
dp[j]=max(dp[j],dp[j-map[0][i]]+p[i]);
}
}
int flag=0;
for(i=0;i<=temp;i++)
{
if(dp[i]>ave)
{
printf("%d\n",i);
flag=1;
break;
}
}
if(flag==0)
printf("impossible\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm dp