• ural 1115,搜索


    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1115

    题意:n个军舰,m个海岸线,各个长度给出,求n个军舰怎么组成这些海岸线。

    思路很简单,就是深搜,好吧,我WA了很多次在test10,错的地方是在回溯,我在处理回溯的时候,只考虑了一条海岸线的回溯,要是下个海岸线结果不能成功了,就要回溯到前一个海岸线,而我直接输出了。

    解决办法: 就是把每一个军舰插入后深搜,这里有个要注意的地方是,一碰到结果,直接退出所有栈,exit(0),这样就解决了拆前一根海岸线。

    两个代码都附到下面。

    /*
    #include <bits/stdc++.h>
    using namespace std;
    
    int n,m;
    
    int dist[105];
    int vis[105];
    int ans[15];
    int t;
    int cnt;
    
    bool dfs(int k,int ans)
    {
        if(k>=ans)
            return true;
        for(int i=0; i<n; i++)
        {
            if(vis[i]==false&&(k+dist[i])<=ans)
            {
                cnt++;
                vis[i] = t;
                if(dfs(k+dist[i],ans)==true)
                    return true;
                vis[i] = 0;
                --cnt;
            }
        }
        return false;
    }
    
    bool cmp(int a,int b)
    {
        return a>b;
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
            scanf("%d",&dist[i]);
        sort(dist,dist+n);
        for(int i=0; i<m; i++)
            scanf("%d",&ans[i]);
    
        t = 1;
        for(int i=0; i<m; i++)
        {
            cnt = 0;
            if(dfs(0,ans[i]))
            {
                printf("%d
    ",cnt);
                for(int i=0; i<n; i++)
                    if(vis[i]==t) {
                        printf("%d ",dist[i]);
                    }
                puts("");
                t++;
            }
        }
        return 0;
    }
    */
    View Code
    #include <bits/stdc++.h>
    using namespace std;
     
    int a[105],len[15];
    bool vis[105];
    vector<int> ans[15];
    int n,m;
    
    void dfs(int x)
    {
        if(x==m)
        {
            for(int i=0; i<m; i++)
            {
                printf("%d
    ",ans[i].size());
                for(int j=0; j<ans[i].size();j++)
                    printf("%d ",ans[i][j]);
                puts("");
            }
            exit(0);
        }
        for(int i=n-1; i>=0; i--)
        {
            if(!vis[i]&&a[i]<=len[x])
            {
                len[x] -= a[i];
                vis[i] = 1;
                ans[x].push_back(a[i]);
                if(!len[x]) dfs(x+1);
                else dfs(x);
                len[x] +=a[i];
                vis[i] = 0;
                ans[x].pop_back();
            }
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        for(int i=0; i<m; i++)
            scanf("%d",&len[i]);
        dfs(0);
        return 0;
    }
    View Code
  • 相关阅读:
    Ubuntu linux安装ssh server
    Ubuntu下PHP配置与安全加强
    ubuntu 终端中文显示乱码问题!
    LINUX命令行如何查看memcache运行状态?
    CI system/libraries/Cache/drivers/memcached.php 兼容 memcache,memcached扩展
    php操作memcache的使用测试总结
    收集国内速度快的Debian或者Ubuntu源
    网易163的 Ubuntu 软件源
    Memcache命令及参数用法
    Memcache所有方法及参数详解
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5898376.html
Copyright © 2020-2023  润新知