1103 Integer Factorization (30 分)

1103 Integer Factorization (30 分)

The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K−P factorization of N for any positive integers N, K and P.

Input Specification:

Each input file contains one test case which gives in a line the three positive integers N (≤400), K (≤N) and P (1

Output Specification:

For each case, if the solution exists, output in the format:

N = n[1]^P + ... n[K]^P

where n[i] (i = 1, ..., K) is the i-th factor. All the factors must be printed in non-increasing order.

Note: the solution may not be unique. For example, the 5-2 factorization of 169 has 9 solutions, such as 12​2​​+4​2​​+2​2​​+2​2​​+1​2​​, or 11​2​​+6​2​​+2​2​​+2​2​​+2​2​​, or more. You must output the one with the maximum sum of the factors. If there is a tie, the largest factor sequence must be chosen -- sequence { a​1​​,a​2​​,⋯,a​K​​ } is said to be larger than { b​1​​,b​2​​,⋯,b​K​​ } if there exists 1≤L≤K such that a​i​​=b​i​​ for ib​L​​.

If there is no solution, simple output Impossible.

Sample Input 1:

169 5 2

Sample Output 1:

169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2

Sample Input 2:

169 167 3

Sample Output 2:

Impossible

 

题意: 给定N, K, P; 将N表示成K个正整数的P次方的和,如果有多中方案,那么选择n1 + .. nk的最大的方案; 如果还有多种方案,选择序列的字典序最大的方案;

分析:dfs深度优先搜索。  

分析:这道题考的是DFS+剪枝,我认为主要剪枝的地方有三个:
1. tempK==K但是tempSum!=n的时候需要剪枝
2. 在枚举的时候,按顺序枚举,上界或者下界可进行剪枝 

#include
#include
#include
#include
using namespace std;
int  n,k,num,maxfcsum=-1,ans[409],a[409],b[409],flag;
void dfs( int index,int cnt ,int sum ,int fcsum){
	 if( sum > n )
	     return;
	 if( cnt == k + 1  ){
	     if( sum == n ){
	     	 if( fcsum > maxfcsum ){
                 memset(ans,0,sizeof(ans));
	     	     for( int i=1;i=1;i--){
	  	       b[cnt] = i;
	 	       dfs(i,cnt+1,sum+a[i],fcsum+i);
     }
}
int main(void){
	int p;
	scanf("%d%d%d",&n,&k,&p);
	for( int i=0;i<=n;i++){
		 if( pow(i,p) <=n ){
		 	 a[i] = pow(i,p);
		     num=i;
		 }
		 else break; 
	} 
	dfs(num,1,0,0);
    if( !flag  ){
        printf("Impossible\n");	
	}
	else { 
	     flag = 0;
         printf("%d = ", n);
		 for( int i=0;i

 

你可能感兴趣的:(dfs深度优先搜索,PAT甲级)