acm题目,请大神帮忙看看。。
#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。。答案出错了。。不知为什么。。
#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。。答案出错了。。不知为什么。。
...全文
相关推荐
ACM2006年题目石头剪刀布
ACM 2006 年题目石头剪刀布ACM(Association for Computing Machinery)是计算机领域的一个非营利组织,旨在推广计算机科学和技术的发展。
ACMの和谐封杀
ACM题。关于顺序串的操作,请自行查找题目。该题比较简单故略去分析。
第二届山东ACM题目.第二届山东ACM题目.
### 第二届山东ACM题目解析#### 一、ASimpleGame 游戏问题**题目背景**在这款游戏中,存在多堆石头,且有两个玩家轮流进行操作。
ACM-PAT甲级题目总结及实现
请记得向作者私信获取解压密码,以获取完整资源。综上所述,ACM-PAT甲级题目是对参赛者全面能力的考验,不仅要求掌握多种算法和数据结构,还需要具备良好的问题解决和调试能力。
福大fzu OJ题目
不要下载此版的,请下载最新的http://download.csdn.net/source/1664620离线版的福大acm在线评测OJ系统题目更新到2009年8月(注:chm电子书格式化)


