思路:一定有sum[1]=num[1]+num[2],sum[2]=num[1]+num[3];
但是sum[3]不知道是由num[1]+num[4]还是num[2]+num[3],这就需要枚举一下了。然后算出num[1],num[2],num[3]的值。
并从sum中剔除他们,这是最小的一个一定是num[1]+num[4],再把num[4]+num[2-(4-1)]的和剔除,这时最小的一定是num[1]+num[5]……
以此类推就可以了……
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1270
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<string>
using namespace std;
int num[105],sum[5100],mark[5100];
int main()
{
int n,i,j,m,c,k;
while(cin>>n&&n)
{
m=(n-1)*n/2;
for(i=1;i<=m;i++)
cin>>sum[i];
sort(sum+1,sum+m+1);
for(i=3;i<=m;i++)
{
num[2]=(sum[1]-sum[2]+sum[i])/2;
num[1]=sum[1]-num[2];
num[3]=sum[2]-num[1];
if(num[2]+num[3]!=sum[i]) continue;
memset(mark,0,sizeof(mark));
mark[i]=1;k=3;
bool flag=1;
for(j=4;j<=n&&flag;j++)
{
while(mark[k]==1) k++;
num[j]=sum[k]-num[1];
mark[k]=1;
for(int l=2;l<j&&flag;l++)
{
flag=0;
for(int x=k+1;x<=m;x++)
{
if(mark[x]==0&&num[j]+num[l]==sum[x])
{
mark[x]=1;
flag=1;
break;
}
}
}
}
if(flag) break;
}
for(i=1;i<n;i++)
cout<<num[i]<<' ';
cout<<num[n]<<endl;
}
return 0;
}