1103 Integer Factorization (30分)

#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
using namespace std;

const int maxn=400;
int n,k,p,num;
int maxSum=0;
int a[maxn];
vector<int> temp;
vector<int> ans;

//也有可能出现maxSum是一样的解:从大到小执行可以直接选择最大的
//因为后续遍历到小的不会发生最大值的替换
//:这也是为什么从小到大(index从0开始执行)出错的原因 

void DFS(int index,int nowk,int nowsum,int nowsqu){
	if(nowk==k){
		if(nowsum>maxSum&&nowsqu==n){
			maxSum=nowsum;
			ans=temp;
		}
		return;
	}
	if(index==0 || nowk>k || nowsqu>n){
		return;
	}
	//选择index数
	if((nowsqu+a[index])<=n){//剪枝 
		temp.push_back(index); 
		DFS(index,nowk+1,nowsum+index,nowsqu+a[index]); 
		temp.pop_back();//Delete last element	
	}	
	//不选择index数 
	DFS(index-1,nowk,nowsum,nowsqu);
}
int main()
{
	
	scanf("%d %d %d",&n,&k,&p);
	
	//对数组a进行预处理:里面存放从0到i的p次方,直到a[i]>n为止
	
	for(num=1;pow(num,p)<=n;num++){
		a[num]=pow(num,p);
		
	} 
	int c=num-1;
	DFS(c,0,0,0);//保证后续的ans是从大到小存储的	
	int size=ans.size();
	if(size>0){
		//注意输出格式=和+两边有空格。。。。 
		printf("%d = ",n);
		for(int i=0;i<size;i++){
		if(i!=0)printf(" + ");
		printf("%d^%d",ans[i],p);
		}
	}else{
		printf("Impossible\n");
	}
	 
	return 0;
	}

注意有个问题是:

题目要求的

 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 i<L and a​L​​>b​L​​.

tie:平局:也就是如果出现多解的情况下,1先判断选出sum最大的(选中的所有factor之和)2.如果sum最大的还有多解,那么按照上面的方法选择一个最优解(算法笔记中称为:选择底数序列的字典序最大的方案)

所以要按照从大到小来执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值