PTA A1103 Integer Factorization (30 分)(DFS)

題目鏈接:點擊這裏
在這裏插入圖片描述
在這裏插入圖片描述

深度優先搜索的詳細介紹及代碼:點擊這裏

#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 1010;

//n,k,p如題所述,maxFacSum記錄最大底數之和 
int n,k,p,maxFacSum=-1;

//fac記錄0^p,1^p,…i^p,使得i^p爲不超過n的最大數
//ans存放最優底數序列,temp存放遞歸中的臨時底數序列
vector<int> fac,ans,temp;

//power函數計算x^p
int power(int x)
{
	int ans = 1;
	for(int i=0;i<p;i++)
		ans *= x;
	return ans;
}

//init函數預處理fac數組,注意把0也存進去 
void init()
{
	int i=0,temp=0;
	while(temp<=n)	
	{
		fac.push_back(temp);
		temp = power(++i);
	} 
}

//DFS函數,當前訪問fac[index],nowK爲當前選中個數
//sum爲當前選中的數之和,facSum爲當前選中的底數之和
void DFS(int index,int nowK,int sum,int facSum)
{
	if(sum==n&&nowK==k)	//找到一個滿足的序列 
	{
		if(facSum>maxFacSum)	//底數之和更優 
		{
			ans = temp;	//更新最優底數序列 
			maxFacSum = facSum; 	//更新最大底數之和 
		}
		return;
	}
	
	if(sum>n||nowK>k)	//這種情況下不會產生答案,直接返回 
		return;
		
	if(index-1>=0)	//fac[0]不需要選擇 
	{
		temp.push_back(index);	//把底數index加入臨時序列temp 
		DFS(index,nowK+1,sum+fac[index],facSum+index);	//"選"的分支 
		temp.pop_back();	//"選"的分支結束後把剛加進去的數pop掉 
		DFS(index-1,nowK,sum,facSum);	//"不選"的分支 
	}
} 


int main()
{
	scanf("%d%d%d",&n,&k,&p);
	init();	//初始化fac數組 
	DFS(fac.size()-1,0,0,0);	//從fac的最後一位開始往前搜索 
	if(maxFacSum==-1)	//沒有找到滿足的序列 
	{	
		printf("Impossible\n");
	}
	else
	{
		printf("%d = %d^%d",n,ans[0],p);	//輸出ans的結果 
		for(int i=1;i<ans.size();i++)
			printf(" + %d^%d",ans[i],p);
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章