1103 Integer Factorization (30分)深度优先搜索,背包问题

①栈中会保存每次dfs递归选择的结果,因此不应该定义在dfs函数内
②递归边界除了满足条件外,不满足条件的除了题目给的不能大于sum,不能大于k位数,还有index不能大于n,因为存在一直不选的情况,而出现段错误。
③下边的dfs的问题:index不是累加,是连乘,而且最好把它作为一个函数写在dfs外边。 ans[num++][i]=v[i];每次付完值都会调到下一行,在【】里的++慎用,应该等一行付完值后再num++

int n,k,p,ans[440][440],num=0,sum=0,nowk=0;
vector<int> v; //不能定义在dfs中
void dfs(int index,int sum,int nowk)
{
    
    
    if(sum==n&&nowk==k)
    {
    
    
        for(int i=0;i<v.size();i++)
            ans[num++][i]=v[i];
        return;
    }
    if(sum>n||nowk>k||index>n) return;
    v.push_back(index);
    for(int i=0;i<p;i++)
        sum+=index;
    dfs(index,sum,nowk+1);
    v.pop_back();
    for(int i=0;i<p;i++)
        sum-=index;
    dfs(index+1,sum,nowk);
}

三个测试点运行超时:要求底数相同则输出字典序大的,那么应该从max^p开始递减的查找index,那么底数和相同的情况下,ans肯定保存的字典序大的,

void dfs(int index,int sum,int nowk)
{
    
    
    if(sum==n&&nowk==k)
    {
    
    
        for(int i=0;i<v.size();i++)
            ans[num][i]=v[i];
        num++;
        return;
    }
    if(sum>n||nowk>k||index>n) return;
    v.push_back(index);
    dfs(index,sum+w(index),nowk+1);
    v.pop_back();
    dfs(index+1,sum,nowk);
}

把nowk写成了k,直接检查,走一遍

#include<bits/stdc++.h>
using namespace std;
int n,k,p,maxfac=-1;
vector<int> temp,ans,ip;
void init()                           //避免重复计算
{
    
    
    int b=1;
    while(pow(b,p)<=n)
    {
    
    
        ip.push_back(pow(b,p));
        b++;
    }
}
void dfs(int index,int sum,int nowk,int tempfac)
{
    
    
    if(nowk==k&&sum==n)
    {
    
    
        if(tempfac>maxfac)
        {
    
    
            ans=temp;
            maxfac=tempfac;
        }
        return;
    }
    if(sum>n||nowk>k) return;
    if(index>0)
    {
    
    
        temp.push_back(index);
        dfs(index,sum+ip[index-1],nowk+1,tempfac+index);
        temp.pop_back();
        dfs(index-1,sum,nowk,tempfac);
    }
}
int main()
{
    
    
    cin>>n>>k>>p;
    init();
    dfs(ip.size(),0,0,0);
    if(maxfac==-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);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42835526/article/details/113531548