dfs | PAT-A | 1103 Integer Factorization

https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224
要求寻找一个数列n1 n2 … nk
构造一棵子集数, 初始化后得到max_nk, 相当于从1~max_nk这max_nk个数中, 每个数可选可不选, 两个状态, 最后选k个数, 让他们满足条件.
关键在于dfs的两个分支:

    //choose
    path.push_back(num);
    dfs(num,len+1,sum+powp[num],num_sum+num);
    path.pop_back();
    //not choose
    if(num>1){
        dfs(num-1,len,sum,num_sum);
    }

选择, 则入栈. sum; num_sum; len 更新, 数字num不变, 可以继续选
不选择, 仅仅判断是否可以继续减少数字, 然后减少数字, 不做任何改变.

#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)

using namespace std;

int powp[1000];
int N,P,K;
int max_nk=1;
int max_num_sum=-1;
vector<int> path;
vector<int> ans;

int get_powp(int x){
    int ans=1;
    FF(i,P)
        ans*=x;
    return ans;
}

void init_powp(){
    while(1){
        powp[max_nk]=get_powp(max_nk);
        if(powp[max_nk]>400)
            break;
        max_nk++;
    }
}

void dfs(int num,int len,int sum,int num_sum){
    if(sum>N || len>K) return;
    if(sum==N && len==K){
        if(num_sum>max_num_sum){
            max_num_sum=num_sum;
            ans=path;
        }
        return;
    }
    //choose
    path.push_back(num);
    dfs(num,len+1,sum+powp[num],num_sum+num);
    path.pop_back();
    //not choose
    if(num>1){
        dfs(num-1,len,sum,num_sum);
    }
}

int main(){
//    freopen("../in1","r",stdin);
    cin>>N>>K>>P;
    init_powp();
    dfs(max_nk,0,0,0);
    if(ans.size()){  //169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
        printf("%d = ",N);
        FF(i,K){
            printf("%d^%d",ans[i],P);
            if(i!=K-1){
                printf(" + ");
            }
        }
        puts("");
    } else
        puts("Impossible");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值