PAT A1103 Integer Factorization (DFS, 类似背包问题)

这是最后看了答案之后修改的:

#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>

#include<cmath>

//new and delete
//A1103 Integer Factorization
using namespace std;

typedef int ElemType ;
vector <int> fac;	//记录不超过N的n^P, dac[1]=1^P; fac[2]=2^P;
vector<int> ans, temp;	//ans最优序列,temp临时序列
int ans_sum=-1;	//ans的底数之和
int N, K, P;
/*
index: 当前处理的是fac[index];
nowK: 当前选择了几个数;
sum: 当前选择的总和
facsum: 当前选择的底数之和 " the maximum sum of the factors."*/
void DFS(int index, int nowK, int sum, int facsum) {
	//cout << index << endl;

	//如果nowK>K或者index<1或者sum>N
	if (nowK > K || index<1 || sum>N) {
		return;
	}
	if (nowK == K && sum == N) {//符合条件的序列
		if (facsum > ans_sum) {
			ans_sum = facsum;
			ans = temp;
		}
		return;
	}

	//选index号数
	temp.push_back(index);
	DFS(index, nowK + 1, sum + fac[index], facsum + index);
	temp.pop_back();
	//不选index号数
	DFS(index - 1, nowK, sum, facsum);

	return;
}

int main() {

	/*fac.clear();
	temp.clear();
	ans.clear();
	ans_sum = -1;*/


	cin >> N >> K >> P;

	//记录不超过N的n^P数组fac, fac[0]=0;fac[1]=1;
	int i = 0;
	while (1) {
		int temp = pow(i, P);
		if (temp > N)
			break;
		fac.push_back(temp);
		i++;
	}

	DFS(fac.size() - 1, 0,0, 0);

	//无解
	if (ans_sum == -1) {
		cout << "Impossible\n";
	}
	else {
		//有解
		cout << N << " = ";
		for (i = 0; i < ans.size(); i++) {
			cout << ans[i] << "^"<<P;
			if (i < ans.size() - 1)
				cout << " + ";
		}
		cout << endl;
	}

	
	
	return 0;
}

下面是最开始根据算法自己写的,这个第三个数据怎么都通过不了。
主要区别是第一种方法分为选和不选,简化了代码,但是思路不好想。

#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>

#include<cmath>

//new and delete
//A1103 Integer Factorization
using namespace std;

typedef int ElemType ;
vector <int> fac;	//记录不超过N的n^P, dac[1]=1^P; fac[2]=2^P;
vector<int> ans, temp;	//ans最优序列,temp临时序列
int ans_sum=-1;	//ans的底数之和
int N, K, P;
/*
index: 当前处理的是fac[index];
nowK: 当前选择了几个数;
sum: 当前选择的总和
facsum: 当前选择的底数之和 " the maximum sum of the factors."*/
void DFS(int index, int nowK, int sum, int facsum) {
	//cout << index << endl;
	
	temp.push_back(index);

	//如果nowK>K或者index<1或者sum>N
	if (nowK > K || index<1 || sum>N) {
		temp.pop_back();
		return;
	}
	if (nowK == K && sum == N) {//符合条件的序列
		if (facsum > ans_sum) {
			ans_sum = facsum;
			ans = temp;
		}
		temp.pop_back();
		return;
	}

	//继续选index号数
	DFS(index, nowK + 1, sum + fac[index], facsum + index);
	//选index-1号数
	DFS(index - 1, nowK + 1, sum + fac[index - 1], facsum + index - 1);


	temp.pop_back();
	return;
}

int main() {

	/*fac.clear();
	temp.clear();
	ans.clear();
	ans_sum = -1;*/


	cin >> N >> K >> P;

	//记录不超过N的n^P数组fac, fac[0]=0;fac[1]=1;
	int i = 0;
	while (1) {
		int temp = pow(i, P);
		if (temp > N)
			break;
		fac.push_back(temp);
		i++;
	}

	for (i = fac.size(); i > 1; i--)
		DFS(i - 1, 1, fac[i - 1], i - 1);

	//无解
	if (ans_sum == -1) {
		cout << "Impossible\n";
	}
	else {
		//有解
		cout << N << " = ";
		for (i = 0; i < ans.size(); i++) {
			cout << ans[i] << "^"<<P;
			if (i < ans.size() - 1)
				cout << " + ";
		}
		cout << endl;
	}

	
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值