PAT A1103 Integer Factorization

很经典的一道DFS的例题,虽然自己之前做过相关的总结,但是还是不由自主地卡住了。。。。

卡住的地方主要在后续的分支判别上:

在最后一句,错误的加上了temp.pop_back()。这里需要注意下,如果只有两条路,也就是加和不加,第一条路走不通则必然走第二条路,所以就不需要temp.pop_back();

还有就是这道题给出了附加条件:

1.最大的数字所组成的和;

2.可以重复选址;

第二点以前接触过,但是对于第一个问题,所解决的方案就是从后向前进行枚举,来确保每次选的都是最大值;

完整代码如下所示:

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int n,k,p,maxFacSum=-1;
vector<int> fac,ans,temp;
//ac记录i^p为不超过n的最大数
//ans存放最优底数序列
//temp存放递归中的临时底数序列
int power(int x){
    int ans=1;
    for(int i=0;i<p;i++){
        ans*=x;
    }
    return ans;
}

void init(){
    int i=0,temp=0;
    while(temp<=n){
        fac.push_back(temp);
        temp=power(++i);
    }
}

void DFS(int index,int nowK,int sum,int facSum){
    if(sum==n&&nowK==k){
        if(facSum>maxFacSum){
            //如果符合要求
            ans=temp;
            maxFacSum=facSum;
        }
    }
    if(sum>n||nowK>k)
        return;
    if(index-1>=0){
        temp.push_back(index);
        DFS(index,nowK+1,sum+fac[index],facSum+index);
        temp.pop_back();
        DFS(index-1,nowK,sum,facSum);
    }
}
int main(){
    scanf("%d%d%d",&n,&k,&p);
    init();
    DFS(fac.size()-1,0,0,0);
    if(maxFacSum==-1){
        printf("Impossible\n");
    }else{
        printf("%d=%d^%d",n,ans[0],p);
        for(int i=1;i<ans.size();i++){
            printf(" + %d^%d",ans[i],p);
        }
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/InNoVaion_yu/article/details/86755188