K.Teamwork Brings Profits!
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 117 Accepted Submission(s) : 53
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Williammed's father is running a small company now, which has N employees.(2<=N<=10 and N is an even number). The employees are numbered from 1 to N. All the employees are divided into N/2 groups. One employee can only be in one group, and each group works
on one project. As we all know, teamwork is very important to a company, so different team can make different profits. And now, given any two people i and j, Williammed's father can tell how much profit(Pij) can they make if they work together. Here comes
the problem, given all the Pij(1 <= i <= N,1 <= j <= N,0 < Pij<= 100), you should tell the most profits this company can make. This is an easy problem, isn't it?
Input
The first line of the input is N(2<=N<=10 and N is an even number),the number of employees in the company.
Then there're N lines,each line has N numbers.The jth number in the ith line is Pij,as we discribe above.And we guarantee Pij = Pji,Pii = 0.
The end-of-file is denoted by a single line containing the integer 0.
Then there're N lines,each line has N numbers.The jth number in the ith line is Pij,as we discribe above.And we guarantee Pij = Pji,Pii = 0.
The end-of-file is denoted by a single line containing the integer 0.
Output
For each case,output the most profits this company can make.
Sample Input
4 0 6 62 13 6 0 35 94 62 35 0 5 13 94 5 0 0
Sample Output
156
Author
Source
Developing School's Contest 6
post code:
直接进行dfs搜索就可以了
#include<stdio.h>
#include<string.h>
int a[12][12];
int visit[12];
int max,t,sum,n;
void dfs( int time ,int sum)
{
if(time==t){if(max<sum)max=sum;return;}
int i,j;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
{
if(visit[i]==false&&visit[j]==false)
{
visit[i]=visit[j]=true; //记录此点已经搜索过了
dfs(time+1,sum+a[i][j]);
visit[i]=visit[j]=false; //将此点变成未搜索过。
}
}
}
int main()
{
int i,j;
while(scanf("%d",&n)&&n!=0)
{
max=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
t=n/2;
memset(visit,false,sizeof(visit));
dfs(0,0);
printf("%d\n",max);
}
}
本文介绍了一个关于团队合作利润最大化的编程问题,该问题需要在有限的员工组合中找到能够带来最高利润的合作方式。通过深度优先搜索算法实现解决方案。
234

被折叠的 条评论
为什么被折叠?



