POJ 3187: Backward Digit Sums

思路:
使用函数next_permutation()按字典序从大到小的顺序进行全排列,每次更新排列后都检查当前排列是否符合所给条件,若符合输出

#include <cstdio>
#include <cstring>
#include <stack>
#include <queue> 
#include <algorithm> 
#include<iostream>
#include<map>
using namespace std;
#define MAX_A 10000


int main(){
    
    
	//输入
	int n,sum;
	scanf("%d %d",&n,&sum);
	int i;
	int array[n];
	for(i=0;i<n;i++){
    
    
		array[i] = i+1;
	} 
	
	//按字典序从大到小的顺序进行全排列
	do{
    
    
		int k = n;//k表示剩余的数 
		int arrayx[n];
		for(i=0;i<n;i++){
    
    
			arrayx[i] = array[i];
		}
		//模拟得到和的过程
		while(k!=1){
    
    
			 int j;
			 for(j=0;j<k-1;j++){
    
    
			 	arrayx[j] = arrayx[j]+arrayx[j+1];
			 }
			 k--;
		}
		if(arrayx[0]==sum){
    
    
			//输出排列
			int j;
			for(i=0;i<n-1;i++){
    
    
				printf("%d ",array[i]);
			} 
			printf("%d\n",array[i]);
			break;
		}
	}while(next_permutation(array,array+n));
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiaobin_23134/article/details/115322625