大意:
给三个正整数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
vector<int> v1(v2);//声明
vector<int> v1;//声明v1 v1.assign(v2.begin(), v2.end());//将v2赋值给v1
#include<iostream> #include<vector> using namespace std; vector<int> v1(); v1.swap(v2);//将v2赋值给v1
vector<int>::iterator it;//声明迭代器 for(it = v2.begin();it!=v2.end();++it)//遍历v2,赋值给v1 { v1.push_back(*it); }
- (最推荐的一种)
#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; }
结果:真是不要再方便一点了最后一种!!!