acm题目,请大神帮忙看看。。

u010709918 2013-05-29 09:01:46
#include<cstdio>
#include<cstring>

#define N 13

bool map[N+1][N+1];
int w[N],dp[1<<N][N+1][N+1],num[1<<N][N+1][N+1];

int Max(int x,int y)
{
return x>y?x:y;
}

int main()
{
int t,n,m,mx,u,v,i,j,k,x,y,tt,mxw,mxn;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++) scanf("%d",&w[i]);
memset(map,false,sizeof(map));
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
map[u-1][v-1]=map[v-1][u-1]=true;
}
if(n==1){ printf("%d 1\n",w[0]);continue;}
memset(dp,-1,sizeof(dp));
for(mx=(1<<n),dp[0][n][n]=i=0,num[0][n][n]=1;i<mx;i++)
{
for(j=0;j<=n;j++)
{
for(k=0;k<=n;k++)
{
if(dp[i][j][k]>=0)
{
for(x=0;x<n;x++)
{
if(((1<<x)&i)==0&&(j==n||map[j][x]))
{
tt=dp[i][j][k]+w[x];
if(j<n) tt+=w[j]*w[x];
if(map[k][x]) tt+=w[k]*w[j]*w[x];
y=((1<<x)|i);
if(tt>dp[y][x][j]){ dp[y][x][j]=tt; num[y][x][j]=num[i][j][k];}
else if(tt==dp[y][x][j]) num[y][x][j]+=num[i][j][k];
}
}
}
}
}
}
for(mxw=-1,i=0;i<=n;i++) for(j=0;j<=n;j++) mxw=Max(mxw,dp[mx-1][i][j]);
if(mxw==-1) puts("0 0");
else
{
for(mxn=i=0;i<=n;i++) for(j=0;j<=n;j++) if(dp[mx-1][i][j]==mxw) mxn+=num[mx-1][i][j];
printf("%d %d\n",mxw,mxn/2);
}
}
return 0;
}

题目是POJ的2288。。http://poj.org/problem?id=2288。。答案出错了。。不知为什么。。
...全文
72 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hugett 2013-05-30
  • 打赏
  • 举报
回复
mxn好像会爆int。。改为__int64。。
u010709918 2013-05-30
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:
mxn好像会爆int。。改为__int64。。
真的是这个问题。。我太粗心了。。

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧