• PAT1103


    是一道搜索题目,没怎么用剪枝,题目给的时间比较充裕。

    在写的过程中出现一个严重的逻辑错误,搜索的范围的出错了。按照我的算法应该是每一次都是从factor递减到1,刚开始写的时候被所谓的“选择和不选择“误导,

    最后还是通过单步调试发现的= =

    还有值得注意的一点是factor是从sqrt(N)开始的

    讲道理按照“选择和不选择“的思路也是可以的,不过要做一点预处理,留个坑来填。

    #include<cstdio>
    #include<vector>
    #include<cmath>
    using namespace std;
    int N,K,P;
    int Pow(int factor)
    {
        int ans=1;
        for(int i=0;i<P;i++)
        {
            ans*=factor;
        }
        return ans;
    }
    bool succ=false;
    vector<int>ans;
    vector<int>seq;
    bool cmp()
    {
        int ansSum=0,seqSum=0;
        for(int i=0;i<ans.size();i++)
        {
            ansSum+=ans[i];
        }
        for(int j=0;j<seq.size();j++)
        {
            seqSum+=seq[j];
        }
        int ansp=0,seqp=0;
        while(ansp<ans.size()&&seqp<seq.size()&&ans[ansp]==seq[seqp]){
            ansp++;
            seqp++;
        }
        if(ansSum==seqSum)
            return ans[ansp]<seq[seqp];
        return ansSum<seqSum;
    }
    void debug()
    {
        for(int i=0;i<seq.size();i++)
        {
            printf("%d ",seq[i]);
        }
        printf("
    
    ");
    }
    void dfs(int factor,int sum)
    {
        if(seq.size()==K){
            if(sum==N){//成功
                succ=true;
                if(cmp()){
                    ans=seq;
                }
                //ans=seq;
            }
            return ;
        }
        if(sum>=N){
            return ;
        }
        for(int i=factor;i>=1;i--)
        {
            seq.push_back(i);
            dfs(i,sum+Pow(i));
            seq.pop_back();
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d%d%d",&N,&K,&P);
        dfs((int)sqrt(N),0);
        if(!succ)printf("Impossible
    ");
        else {
            printf("%d =",N);
            //169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
            //169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
            for(int i=0;i<ans.size();i++)
            {
                printf(" %d^%d",ans[i],P);
                if(i<ans.size()-1)printf(" +");
                else printf("
    ");
            }
        }
        //getchar();
    }
    View Code
    
    

  • 相关阅读:
    Spring.Net AOP的通知类型及通知链
    Spring.Net框架介绍及基本配置(学习笔记一)
    Spring.Net对方法的注入(学习笔记三)
    Spring通过容器获取配置对象及事件注入(学习笔记二)
    SqlServer2008 数据库同步的两种方式(Sql JOB)
    AOPUnity使用初探
    PIABPolicy Injection Application Block
    LINQ查询基础
    C#泛型基础
    [转载]CSS块级元素和行内元素
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/8442976.html
Copyright © 2020-2023  润新知