最短路径 pat 1103


#include <iostream>
#include<vector>

#include <iostream>

#include <vector>

#include <cmath>

using namespace std;

int n, k, p, maxFacSum = -1;

vector<int> v, ans, tempAns;

void init(){

       int i = 1, num =0;
       while(num<=n){
              v.push_back(num);
              num = pow(i,p);
              i++;
       }
}

void dfs(int index, int tempSum, int tempK, int facSum) {

    if (tempK == k) {

        if (tempSum == n && facSum > maxFacSum) {

                ans = tempAns;

                maxFacSum = facSum;

        }

        return;

    }

    while(index >= 1) {

        if (tempSum + v[index] <= n) {

            tempAns[tempK] = index;

            dfs(index, tempSum + v[index], tempK + 1, facSum + index);

        }

        if (index == 1) return;

        index--;

    }

}

int main()
{
       freopen("1103.txt","r",stdin);
       cin>>n>>k>>p;
       tempAns.resize(k);  这个不能少了 不然会爆炸 debug 不了
       init();
       dfs(v.size() - 1,0,0,0);
       int x = maxFacSum;
       int y = x;
       if(maxFacSum ==-1 ){
              cout<<"Impossible";
              return 0;
       }else{
              printf("%d = ",n);
              for(int i = 0; i < k; i++){
                     printf("%d^%d",ans[i],p);
                     if(i<k-1) cout<<" + ";
                     else printf("\n");
              }
       }
    //cout << "Hello world!" << endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值