zoukankan      html  css  js  c++  java
  • UVA529 Addition Chains

    做题5分钟,调题一小时

    总结错误:

    1.剪枝

    1. 采用IDA*优化:估价函数就是每次最多增加两倍
    2. 因为序列单调递增,所以如果前面两数相加小于当前值,再往前找也没有意义
    3. 因为要尽量逼近n,所以要从后往前枚举

    2.去重数组不好处理,会错,所以不能采用

    Code

    #include<bits/stdc++.h>
    #pragma GCC optimize("O2")
    using namespace std;
    int b[20001],ans[105],a[105],n,sum;
    void clear(){fill(a+1,a+105,0);a[0]=1;fill(b+1,b+n+1,0);} 
    bool print(){for(int i=0;i<sum-1;i++)printf("%d ",a[i]);printf("%d
    ",a[sum-1]);return true;}
    bool dfs(int step){
        if(a[step-1]==n)return print();
        if(step>=sum||a[step-1]*(long long)1<<(sum-step+1)<n)return false;
        for(int i=step-1;i>=0;i--)
         for(int j=i;j>=0;j--){
             if(a[i]+a[j]<=a[step-1])break;
             if(a[i]+a[j]>n)continue;
               a[step]=a[i]+a[j];
             if(dfs(step+1))
              return true;
          } 
        return false;
    }
    int main(){
        while(scanf("%d",&n)&&n){
            sum=1;
            clear();
            while(!dfs(1))++sum,clear();
        } 
    } 
  • 相关阅读:
    字典
    字符串常用的方法
    切片,集合、文件处理
    蓝桥杯练习 Day6 题解
    spoj-ORDERS
    spoj-SUBSUMS
    spoj
    spoj --- ABCDEF
    C. Andryusha and Colored Balloons
    B. The Meeting Place Cannot Be Changed
  • 原文地址:https://www.cnblogs.com/coder-cjh/p/11566846.html
Copyright © 2011-2022 走看看