Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5664 | Accepted: 3280 |
Description
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.
Input
Output
Sample Input
4 16
Sample Output
3 1 2 4
Hint
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
4 3 6
7 9
16
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define P_ printf(" ") const int MAXN=1010; int ans[MAXN]; int vis[MAXN]; int N,M; int flot; int a[15]; void dfs(int num){ if(flot)return; if(num==N){ int sum=0,temp=N; for(int i=0;i<N;i++)a[i]=ans[i]; while(temp>1){ for(int i=0;i<temp-1;i++){ a[i]+=a[i+1]; } temp--; } sum=a[0]; if(sum==M){ for(int i=0;i<N;i++){ if(i)P_; printf("%d",ans[i]); } puts(""); flot=1; } return ; } for(int i=0;i<N;i++){ if(vis[i+1])continue; ans[num]=i+1; vis[i+1]=1; dfs(num+1); vis[i+1]=0; } } int main(){ while(~scanf("%d%d",&N,&M)){ if(N==1){ puts("1");continue; } mem(vis,0); flot=0; dfs(0); } return 0; }
另一种写法:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int sum; bool cal(int (*a)[15], int N){ for(int i = 2; i <= N; i++){ for(int j = 1; j <= N - i + 1; j++){ a[i][j] = a[i - 1][j] + a[i - 1][j + 1]; } } if(a[N][1] == sum) return true; else return false; } int main(){ int N; int a[15][15]; while(~scanf("%d%d", &N, &sum)){ for(int i = 1; i <= N; i++){ a[1][i] = i; } do{ if(cal(a, N)){ for(int i = 1; i <= N; i++){ printf("%d", a[1][i]); if(i != N){ printf(" "); }else{ printf("\n"); } } break; } }while(next_permutation(a[1] + 1, a[1] + N + 1)); } return 0; }