PAT甲级1103(算法笔记上机8.1DFS)

1103 Integer Factorization (30分)

The KP 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 KP factorization of N for any positive integers NK and P.

Input Specification:

Each input file contains one test case which gives in a line the three positive integers N (≤), K (≤) and P (1,7]. The numbers in a line are separated by a space.

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 1, or 1, 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 { , } is said to be larger than { , } if there exists 1 such that ai=bi for i<L and aL>bL.

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=i的P次方的和,如P=2,开数组fac,保存1^2,2^2...........直到i^2<=N,fac[1]=1,fac[2]=4,将fac[0]=0保存进去,让下标和次方一一对应,这题就转化成在数组FAC中查找K个数的和=N,典型的DFS题目,加上题目的几个限制条件找出最优解。
#include<iostream>
#include<vector>
using namespace std;
int n, k, p,maxd;
vector<int>fac, temp, ans;
int pow(int x)
{
	int ans=1;
	for (int i = 0; i < p; i++)
		ans *= x;
	return ans;
}
void init()
{
	int temp=0;
	int i = 0;
	while (temp <= n)
	{
		fac.push_back(temp);
		temp = pow(++i);
	}
}
void DFS(int idex, int nowk, int sumd, int sum)
{
	if (sum > n || nowk > k)return;
	if (sum == n && nowk == k)
	{
		if (sumd > maxd)
		{
			ans = temp;
			maxd = sumd;
		}
		return;
	}
	if (idex - 1 >= 0)
	{
		temp.push_back(idex);
		DFS(idex, nowk + 1, sumd + idex, sum + fac[idex]);
		temp.pop_back();
		DFS(idex - 1, nowk , sumd , sum );
	}
	
}
int main()
{
	FILE* stream1;
	freopen_s(&stream1, "input.txt", "r", stdin);
	while (cin >> n >> k >> p)
	{
		maxd = -1;
		fac.clear();
		ans.clear();
		temp.clear();
		init();
		cout << endl;
		DFS(fac.size() - 1, 0, 0, 0);
		if (maxd ==-1)
			printf("Impossible\n");
		else
		{
			printf("%d = %d^%d", n, ans[0], p);
			for (int i = 1; i < ans.size(); i++)
			{
				printf(" + %d^%d", ans[i], p);
			}
			printf("\n");
		}
	}
	return 0;
}


代码学习笔记 文章被收录于专栏

学习笔记,pat,牛客

全部评论

相关推荐

大族激光智能控制科技 算法工程师 12K+加班费2.5K,十五薪,一年调一次薪,区间0.1-0.3,写专利,论文一份一万,会系统化培养应届生
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务