FAFU 1072 - 组合(深度优先)

题目链接:http://acm.fafu.edu.cn/problem.php?id=1072

组合的话由于数小于等于10,可以用穷举法,不过没有算法味道

#include <stdio.h>
#include <string.h>
int main(void)
{
	int i, n, k, m, sum = 0;
	int a[10];
	int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
	scanf("%d%d", &n, &k);

	for(i = 0;i < n; ++i)
	{
		scanf("%d", &a[i]);
	}
	switch (k)
	{
	case 1:
		for(i1 = 0; i1 < n; ++i1)
		{
			sum += a[i1];	
		}
		break;
	case 2:
		for(i1 = 0; i1 < n - 1; ++i1)
		{
			for(i2 = i1 + 1; i2 < n; ++i2)
			{
				sum += a[i1]*a[i2];
			}
		}
		break;
	case 3:
		for(i1 = 0; i1 < n - 2; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 1; ++i2)
			{
				for(i3 = i2 + 1; i3 < n; ++i3)
				{
					sum += a[i1]*a[i2]*a[i3];
				}
			}
		}
		break;
	case 4:
		for(i1 = 0; i1 < n - 3; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 2; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 1; ++i3)
				{
					for(i4 = i3 + 1; i4 < n; ++i4)
					{
						sum += a[i1]*a[i2]*a[i3]*a[i4];
					}
				}
			}
		}
		break;
	case 5:
		for(i1 = 0; i1 < n - 4; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 3; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 2; ++i3)
				{
					for(i4 = i3 + 1; i4 < n - 1; ++i4)
					{
						for(i5 = i4 + 1; i5 < n; ++i5)
						{
							sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5];
						}
					}
				}
			}
		}
		break;
	case 6:
		for(i1 = 0; i1 < n - 5; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 4; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 3; ++i3)
				{
					for(i4 = i3 + 1; i4 < n - 2; ++i4)
					{
						for(i5 = i4 + 1; i5 < n - 1; ++i5)
						{
							for(i6 = i5 + 1; i6 < n; ++i6)
							{
								sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6];
							}
						}
					}
				}
			}
		}
		break;
	case 7:
		for(i1 = 0; i1 < n - 6; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 5; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 4; ++i3)
				{
					for(i4 = i3 + 1; i4 < n - 3; ++i4)
					{
						for(i5 = i4 + 1; i5 < n - 2; ++i5)
						{
							for(i6 = i5 + 1; i6 < n - 1; ++i6)
							{
								for(i7 = i6 + 1; i7 < n; ++i7)
								{
									sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7];
								}
							}
						}
					}
				}
			}
		}
		break;
	case 8:
		for(i1 = 0; i1 < n - 7; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 6; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 5; ++i3)
				{
					for(i4 = i3 + 1; i4 < n - 4; ++i4)
					{
						for(i5 = i4 + 1; i5 < n - 3; ++i5)
						{
							for(i6 = i5 + 1; i6 < n - 2; ++i6)
							{
								for(i7 = i6 + 1; i7 < n - 1; ++i7)
								{
									for(i8 = i7 + 1; i8 < n; ++i8)
									{
										sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7]*a[i8];
									}
								}
							}
						}
					}
				}
			}
		}
		break;
	case 9:
		for(i1 = 0; i1 < n - 8; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 7; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 6; ++i3)
				{
					for(i4 = i3 + 1; i4 < n - 5; ++i4)
					{
						for(i5 = i4 + 1; i5 < n - 4; ++i5)
						{
							for(i6 = i5 + 1; i6 < n - 3; ++i6)
							{
								for(i7 = i6 + 1; i7 < n - 2; ++i7)
								{
									for(i8 = i7 + 1; i8 < n - 1; ++i8)
									{
										for(i9 = i8 + 1; i9 < n; ++i9)
										{
											sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7]*a[i8]*a[i9];
										}
									}
								}
							}
						}
					}
				}
			}
		}
		break;
	case 10:
		for(i1 = 0; i1 < n - 9; ++i1)
		{
			for(i2 = i1 + 1; i2 < n - 8; ++i2)
			{
				for(i3 = i2 + 1; i3 < n - 7; ++i3)
				{
					for(i4 = i3 + 1; i4 < n - 6; ++i4)
					{
						for(i5 = i4 + 1; i5 < n - 5; ++i5)
						{
							for(i6 = i5 + 1; i6 < n - 4; ++i6)
							{
								for(i7 = i6 + 1; i7 < n - 3; ++i7)
								{
									for(i8 = i7 + 1; i8 < n - 2; ++i8)
									{
										for(i9 = i8 + 1; i9 < n - 1; ++i9)
										{
											for(i10 = i9 + 1; i10 < n - 1; ++i10)
											{
												sum += a[i1]*a[i2]*a[i3]*a[i4]*a[i5]*a[i6]*a[i7]*a[i8]*a[i9]*a[i10];
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		break;
	default: 
		break;
	}

	printf("%d\n", sum);
	return 0;
}

可以用深度优先算法来做,代码简练精短

#include<stdio.h>

int m,n,a[15],ans=0;

void dfs(int x,int k,int j)
{
	if(k==m)
	{
		ans+=j;
		return;
	}
	if(x>n) return;
	dfs(x+1,k+1,j*a[x]);
	dfs(x+1,k,j);
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	dfs(1,0,1);
	printf("%d\n",ans);
	return 0;
}


能写出第一个代码,真的是太佩服我自己了~~~~(>_<)~~~~ 

你可能感兴趣的:(ACM,fafu1072)