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.
题意:
给一组N的全排列,问按照题中的那种操作,哪一种情况等于sum(要求顺序最小的),并且输出
直接dfs全排列就行了
#include <stdio.h>
#include <string.h>
#include <iostream>
int flag;
int v[15];
int a[15][15];
int N, sum;
int judge() {
for(int i = N-1; i >= 0; i--){
for(int j = 0; j < i; j++) {
a[i-1][j] = a[i][j] + a[i][j+1];
}
}
if(a[0][0] == sum) {
for(int i = 0; i < N; i++) {
printf("%d",a[N-1][i]);
if(i != N-1)
printf(" ");
}
printf("\n");
return 1;
}
else return 0;
}
void dfs(int x) {
if(flag) return ;
if(x > N) return ;
if(x == N) {
if(judge()) {
flag = 1;
return ;
}
}
for(int i = 1; i <= N; i++) {
if(v[i] == 0) {
a[N-1][x] = i;
v[i] = 1;
dfs(x+1);
v[i] = 0;
}
}
return ;
}
int main() {
while(~scanf("%d%d",&N,&sum)) {
flag = 0;
memset(v, 0, sizeof(v));
dfs(0);
}
return 0;
}