• 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
  • 相关阅读:
    Java Lambda 表达式 对 Map 对象排序
    比较两个list对象是否相同
    ubuntu redis 自启动配置文件(关机有密码)
    spring中订阅redis键值过期消息通知
    网站架构之性能优化(转)
    Json转Java Bean
    spring mvc 4 校验
    java @ResponseBody返回值中去掉NULL字段
    合并两个java bean对象非空属性(泛型)
    spring mvc 删除返回字符串中值为null的字段
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5898376.html
Copyright © 2020-2023  润新知