zoukankan      html  css  js  c++  java
  • DFS 专题 Accepted Necklace

    这道题如果用 DFS 必须剪枝:剪掉重复的组合。DFS 枚举了所有的排列,实际上这道题只需要组合。

    View Code
    # include <cstdio>
    # include <cstring>
    
    # define N 20 + 5
    
    int ans;
    int n, k, vMax, v[N], w[N];
    bool vis[N];
    
    void dfs(int cur, int sum, int cnt, int weight)
    {
        if (weight > vMax) return ;
        if (cnt == k) ans = (sum > ans ? sum : ans);
        else
        {
            for (int i = cur+1; i <= n; ++i) if (vis[i] == false)
            {
                vis[i] = true;
                dfs(i, sum+v[i], cnt+1, weight+w[i]);
                vis[i] = false;
            }
        }
    }
    
    void init(void)
    {
        scanf("%d%d", &n, &k);
        for (int i = 1; i <= n; ++i)
            scanf("%d%d", &v[i], &w[i]);
        scanf("%d", &vMax);
        memset(vis, false, sizeof(vis));
    }
    
    void solve(void)
    {
        ans = 0;
        dfs(0, 0, 0, 0);
        printf("%d\n", ans);
    }
    
    int main()
    {
        int T;
    
        scanf("%d", &T);
        while (T--)
        {
            init();
            solve();
        }
    
        return 0;
    }

    /**/

  • 相关阅读:
    ReactJs入门
    Studio-Class Diagram
    Visual Studio-Sequence Diagram
    架构、职责、数据一致性
    Microsoft Build 2015
    Net下无敌的ORM
    SpringMVC1
    插件式Web框架
    ASP.NET的CMS
    Android Drawable绘图学习笔记(转)
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2599647.html
Copyright © 2011-2022 走看看