Backward Digit Sums
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,sum;
int s[11],a[11];
int delchild()
{
int i,j;
for(i=0;i<n;i++)
{
a[i]=s[i];
}
for(i=n;i>0;i--)
{
for(j=0;j<i-1;j++)
{
a[j]+=a[j+1];
}
}
if(a[0]==sum)
return 1;
return 0;
}
void output()
{
for(int i=0;i<n-1;i++)
cout<<s[i]<<" ";
cout<<s[n-1]<<endl;
}
void del()
{
if(delchild())
{
output();
}
else
{
while(next_permutation(s,s+n)) //排序不包含初始序列
{
if(delchild())
{
output();
break;
}
}
}
}
int main()
{
cin>>n>>sum;
for(int i=0;i<n;i++)
s[i]=i+1;
del();
return 0;
}
这个题就暴力枚举。。。
1 2 3 4
3 5 7 //delchild里的双重循环就是这个得出20的过程
8 12
20
del里选择的原因是next_permutation(s,s+n)全排列不包含初始序列
比如,a[3]={1,2,3};
next_permutation(a,a+3)得:
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1