POJ 3187 Backward Digit Sums

题目大意:

1.输入N,找到由1-N组成的数列,把相邻两个数相加组成一个新的数组,直到这个数组只剩下一个值并且这个值等于给定的K。

思路:

这里可以用到一个非常好用的函数,名字叫next_permutation先来看一个简单的应用

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int d[10];
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		d[i]=i+1;
	do
	{
		for(int i=0;i<n;i++)
			cout<<d[i]<<" ";
		cout<<endl;
	}while(next_permutation(d,d+n));
	
}

next_permutation函数有两个参数,要进行全排列的数组的头指针和尾指针,一般直接写函数名和函数名+要全排列的数量就好了

使用这个函数这道题剩下的部分就很简单了,双重循环,把两个数加起来存到第一个数的位置(因为第一个数对后来的计算不影响,所以可以这么存)。

接下来上代码。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,sum,m;
int b[11];
int a[11];
int main()
{
	cin>>n>>m;
	int i,j;
	for(i=0;i<n;i++)
	b[i]=i+1;
	do
	{
		for(i=0;i<n;i++)
		a[i]=b[i];
		for(i=n;i>1;i--)
		{
			for(j=0;j<i-1;j++)
			{
				a[j]=a[j]+a[j+1];
			}
		}
		if(a[0]==m)
		{
			for(i=0;i<n;i++)
			printf("%d ",b[i]);
			printf("\n");
			break;
		}
	}while(next_permutation(b,b+n));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36715504/article/details/81433893