• [USACO 2012 Jan Silver] Bale Share【DP】


    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=107

    没想到太不应该了,真的不应该啊!

    f[i][j][k]表示前i个包,第一个包里共有j大小的物品,第二个包里共有k大小的物品是否成立,则方程为:

    f[i][j][k] = f[i - 1][j - a[i]][k] || f[i - 1][j][k - a[i]] || f[i - 1][j][k];

    观察方程,可以省去数组a改用单独一个变量,并使用滚动数组,详见代码。

    #include <cstdio>
    
    const int maxn = 21;
    
    int n, a, s, ans = 2147483647;
    bool f[2005][2005];
    
    inline int minn(int aa, int ss) {
        return aa < ss? aa: ss;
    }
    inline int max3(int aa, int ss, int dd) {
        aa = aa > dd? aa: dd;
        return aa > ss? aa: ss;
    }
    
    int main(void) {
        freopen("baleshare.in", "r", stdin);
        freopen("baleshare.out", "w", stdout);
        scanf("%d", &n);
        f[0][0] = true;
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &a);
            s += a;
            for (int j = s; j >= 0; --j) {
                for (int k = s - j; k >= 0; --k) {
                    if (j >= a) {
                        f[j][k] = f[j][k] || f[j - a][k];
                    }
                    if (k >= a) {
                        f[j][k] = f[j][k] || f[j][k - a];
                    }
                }
            }
        }
        
        for (int j = 0; j <= s; ++j) {
            for (int k = 0; j + k <= s; ++k) {
                if (f[j][k]) {
                    ans = minn(ans, max3(j, k, s - j - k));
                }
            }
        }
        printf("%d
    ", ans);
        return 0;
    }

    为什么会变成这样呢,明明是一道水题。。。

  • 相关阅读:
    20121010 闲的慌的日子
    九月,桂花飘香的季节
    win7下控件(ActiveX)注册错误(0x80040200) 修正
    C#多线程技术(一)
    C#多线程技术(二)
    C++沉思录摘录(OOP部分)
    SVM入门教程
    是IE的bug还是Windows的bug?
    inno setup安装时不需要开始菜单项
    django本地局域网访问
  • 原文地址:https://www.cnblogs.com/ciao-sora/p/5958011.html
Copyright © 2020-2023  润新知