zoukankan      html  css  js  c++  java
  • USACO sec2.1 Healthy Holsteins

    状态压缩,先将生成的所有状态排序,然后枚举即可。

    /*
    PROG : holstein
    LANG : C
    */
    # include <stdio.h>
    # include <stdlib.h>
    
    struct scoop{int a[30];};
    
    int V, G, r[(1 << 17) + 5];
    struct scoop g[17], v;
    
    /***************************************************/
    int bcnt(int x)
    {
        int ret = 0;
        while (x)
        {
            ++ret;
            x &= x-1;
        }
        return ret;
    }
    
    int cmp(const void *xx, const void *yy)
    {
        int x = *(int*)xx;
        int y = *(int*)yy;
        int t = bcnt(x) - bcnt(y);
        if (t == 0) return x>y ? 1:-1;
        return t;
    }
    
    void pre(void)
    {
        int i;
        for (i = 0; i < (1<<(G+1)); ++i) r[i] = i;
        qsort(r, (1<<(G+1)), sizeof(r[1]), cmp);
    }
    
    int cal(int x)
    {
        int i, j;
        struct scoop tmp = v;
        for (i = 0; i < G; ++i) if ((x>>i) & 0x1)
        for (j = 1; j <= V; ++j)
            tmp.a[j] -= g[i+1].a[j];
        for (j = 1; j <= V; ++j)
            if (tmp.a[j] > 0) return 0;
        return 1;
    }
    
    void solve(void)
    {
        int i, k;
        pre();
        for (i = 0; i < (1<<(G+1)); ++i)
            if (cal(r[i])) break;
        printf("%d", bcnt(r[i]));
        for (k = 0; k < G; ++k) if ((r[i]>>k)&0x1)
            printf(" %d", k+1);
        putchar('\n');
    }
    /***************************************************/
    
    void read(void)
    {
        int i, j;
        scanf("%d", &V);
        for (i = 1; i <= V; ++i) scanf("%d", &v.a[i]);
        scanf("%d", &G);
        for (i = 1; i <= G; ++i)
        for (j = 1; j <= V; ++j)
            scanf("%d", &g[i].a[j]);
    }
    
    int main()
    {
        freopen("holstein.in", "r", stdin);
        freopen("holstein.out", "w", stdout);
    
        read();
        solve();
    
        fclose(stdin);
        fclose(stdout);
    
        return 0;
    }

    DFS 毫无疑问会超时。

  • 相关阅读:
    超有爱的并查集
    写给想当程序员的朋友
    POJ 1961 字符串 KMP (i-next[i])
    POJ 2406 KMP算法next数组理解
    POJ 2387 Bellman双重边
    POJ 1917 字符串替换
    POJ 1062 坑爹的聘礼(枚举等级差选择性找边)
    Linux下libxml2的使用
    浙大pat 1003
    判定一棵二叉树是否是二叉搜索树
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2649482.html
Copyright © 2011-2022 走看看