一道搜索好题

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道搜索好题相关的知识,希望对你有一定的参考价值。

给定一个数S,找任意个正整数a1,a2,…,an,使得它们的和恰好等于S,且它们的倒数之和与1的差不超过10^-6。

输出任意一种方案或者输出无解。

S<=10^7

 

自由搜索

自己加限制:搜索递增

强效剪枝:

if(sum+1.0/S>eps+1) return;
八位数秒处
#include<cmath>
#include<cstdio>
using namespace std;
const double eps=1e-6;
int ans[1001];
bool ok;
void dfs(int S,double sum,int last,int now)
{
    if(ok) return;
    if(!S)
    {
        if(abs(1-sum)<eps) 
         {
             for(int i=1;i<now;i++) printf("%d ",ans[i]);
             ok=true;
         }
        return;
    }
    if(sum+1.0/S>eps+1) return;
    for(int i=last+1;i<=S;i++) 
     {
         ans[now]=i;
         dfs(S-i,sum+1.0/i,i,now+1);
         if(ok) return;
     }
}
int main()
{
    int S;
    scanf("%d",&S);
    dfs(S,0,1,1);
} 

 

以上是关于一道搜索好题的主要内容,如果未能解决你的问题,请参考以下文章

一道dfs和dp结合的好题 --- Longest Run on a SnowboardUVA-10285

[dfs] aw1117. 单词接龙(dfs搜索顺序+递归理解+好题)

一道图论好题

字节一面的一道好题:如何实现异步链式调用

重排链表 一道无聊的好题

CZY选讲·一道图论好题