1103 Integer Factorization (30 分)【DFS+剪枝】

题干戳这儿

大意:

给三个正整数N、K、P,将N表示成K个正整数(可以相同,递减排列)的P次方和,如果有多种方案,选择底数n1+…+nk最大的方案,如果还有多种方案,选择底数序列的字典序最大的方案。

思路:柳婼

代码:

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int n,k,p,maxFacSum=-1;
vector<int> v,ans,tempans;
void dfs(int index,int tempk,int tempSum,int factSum){
	if(tempk==k){
		if(tempSum==n&&factSum>maxFacSum){
			maxFacSum=factSum;
			ans=tempans;	//**这个真的可以! 
		}
		return ;
	}
	while(index>=1){
		if(tempSum+v[index]<=n){
			tempans[tempk]=index;
			dfs(index,tempk+1,tempSum+v[index],factSum+index);
			//这里index不减1,因为可以有多个相同的数的p次方相加 
		}
		if(index==1) return ;
		index--;
	}
}

int main(){
	cin>>n>>k>>p;
	tempans.resize(k);
	int i=0;
	while(pow(i,p)<=n){
		v.push_back(pow(i,p));
		i++;
	}
	dfs(v.size()-1,0,0,0);
	if(maxFacSum==-1) {
		cout<<"Impossible";
		return 0; 
	}
	printf("%d = ",n);
	for(int i=0;i<ans.size();i++){
		if(i>0) printf(" + ");
		printf("%d^%d",ans[i],p);
	}
	return 0;
} 

 引入: 一个vector赋值给另一个vector

  1. vector<int> v1(v2);//声明
  2. vector<int> v1;//声明v1
    v1.assign(v2.begin(), v2.end());//将v2赋值给v1
    
  3. #include<iostream>
    #include<vector>
    using namespace std;
    vector<int> v1();
    v1.swap(v2);//将v2赋值给v1
  4. vector<int>::iterator it;//声明迭代器
    for(it = v2.begin();it!=v2.end();++it)//遍历v2,赋值给v1
    {
         v1.push_back(*it);
    }
  5. (最推荐的一种)
    #include<iostream>
    #include<vector>
    using namespace std;
    int main(){
    	vector<int> v1,v2;
    	for(int i=1;i<10;i++){
    		v1.push_back(i);
    	}
    	v2=v1;
    	cout<<"v2数组的值:"<<endl; 
    	for(int i=0;i<v2.size();i++)
    		cout<<v2[i]<<" ";
    		return 0;
    }

    结果:真是不要再方便一点了最后一种!!!

猜你喜欢

转载自blog.csdn.net/WKX_5/article/details/114583092