呀吧。这个题居然是这样子的,自己补得,笑哭,就是一个全排列,因为数据太小所以不会超时
全排列加上递归求树的和, next_permutation用来求全排列十分方便
FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this:
Write a program to help FJ play the game and keep up with the cows.
3 1 2 4 4 3 6 7 9 16Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities.
Write a program to help FJ play the game and keep up with the cows.
Line 1: Two space-separated integers: N and the final sum.
Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.
4 16
3 1 2 4
Explanation of the sample:
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
代码,真好玩,这是我的代码,等会看看大神的代码,是不是会简单
#include <iostream>
#include<algorithm>
using namespace std;
int n,s;
int cr[15];
int sum[15];
int arr(int x)
{
if(x==1)
return 1;
else
return x*arr(x-1);
}
int ju(int x)
{
if(x==1)
{
if(sum[1]==s)
return 1;
else
return 0;
}
for(int i=1,j=1;i<x;i++,j++)
{
sum[j]=sum[i]+sum[i+1];
}
ju(x-1);
}
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
cr[i]=i;
for(int i=1;i<=arr(n);i++)
{
for(int j=1;j<=n;j++)
sum[j]=cr[j];
if(ju(n))
break;
next_permutation(cr+1,cr+n+1);
}
for(int i=1;i<n;i++)
cout<<cr[i]<<" ";
cout<<cr[n]<<endl;
return 0;
}
差不多
不过他们求和的时候用的不是一个递归,而是用的两个for循环
int ju()
{
for(int i=n;i>1;i--)
for(int j=1;j<i;j++)
sum[j]=sum[j]+sum[j+1];
if(sum[1]==s)
return 1;
else
return 0;
}
不错,不错,然后去看了看lyj的代码,哇真简洁,可棒get到了(虽然思路是一样的可是人家总是写的那么简洁)
#include <iostream>
#include<algorithm>
using namespace std;
int n,s;
int cr[15];
int sum[15];
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
cr[i]=i;
int x=n;
while(x!=1)
{
for(int i=1;i<=x;i++)sum[i]+=sum[i+1];
x--;
if(x==1)
{
if(sum[1]==s)
break;
else
{
x=n;
next_permutation(cr+1,cr+n+1);
for(int i=1;i<=n;i++)
sum[i]=cr[i];
}
}
}
for(int i=1;i<n;i++)
cout<<cr[i]<<" ";
cout<<cr[n]<<endl;
return 0;
}