全排列的使用
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
int a[20],b[20][20];
int main()
{
int i,j,m,n,sum,sum1;
while(scanf("%d%d",&m,&n)!=EOF)
{
sum=1;
memset(a,0,sizeof(a));
for(i=0;i<m;i++)
{
a[i]=i+1;
}
for(i=m;i>=1;i--)
{
sum*=i;
}
while(sum--)
{
for(i=0;i<m;i++)
{
b[0][i]=a[i];
}
for(i=0;i<m-1;i++)
{
for(j=0;j<m-1-i;j++)
{
b[i+1][j]=b[i][j]+b[i][j+1];
}
}
if(b[m-1][0]==n)
{
break;
}
next_permutation(a,a+m);
}
for(i=0;i<m-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[m-1]);
}
}
poj 2718
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
bool cmp(int c,int d)
{
return c<d;
}
int main()
{
int m,n,i,j,b[100],sum1,sum2,k;
char a[100];
while(scanf("%d",&m)!=EOF)
{
getchar();
while(m--)
{
k=0;
j=100000;
int sum=1;
gets(a);
n=strlen(a);
for(i=0;i<n;i++)
{
if(a[i]!=' ')
{
b[k]=a[i]-'0';
k++;
}
}
n=k;
sort(b,b+n,cmp);
if(n==1)
{
printf("%d\n",b[0]);
continue;
}
if(n==2)
{
printf("%d\n",b[1]-b[0]);
continue;
}
for(i=1;i<=n;i++)
{
sum*=i;
}
while(sum--)
{
if(b[0]==0||b[n/2]==0)
{
next_permutation(b,b+n);
continue;
}
sum1=sum2=0;
for(i=0;i<n/2;i++)
{
sum1=sum1*10+b[i];
}
for(i=n/2;i<n;i++)
{
sum2=sum2*10+b[i];
}
k=sum1-sum2;
if(k<0)
k=0-k;
if(j>k)
{
j=k;
}
next_permutation(b,b+n);
}
printf("%d\n",j);
}
}
}