[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\n", ans);
    return 0;
}

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

时间: 2024-10-05 06:30:18

[USACO 2012 Jan Silver] Bale Share【DP】的相关文章

bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2581 这题我一看就知道自己不会了,只想了个O(2^n * 2 ^ n)即O(2 ^ 2n)的大暴力,也懒得打了,果断看solution. 看了之后惊呆了,看到了一种从未见过,闻所未闻的树叫做And-Or Tree,百度了一下,并没有官方中文翻译,姑且叫他"

bzoj 1700: [Usaco2007 Jan]Problem Solving 解题【dp】

很像贪心的dp啊 这个定金尾款的设定让我想起了lolita和jk制服的尾款地狱-- 设f[i][j]为从j到i的付定金的最早月份然后从f[k][j-1]转移来,两种转移f[i][j]=min(f[i][j],f[j-1][k]+1)是当前这个月付[k-1,j-1]的尾款和[j,i]的定金,f[i][j]=min(f[i][j],f[j-1][k]+2)是先付[k-1,j-1]的尾款,下个月再付[j,i]的定金 然后答案要+2,是最后一次付定金的尾款加上第一个月没有工资 #include<iost

USACO翻译:USACO 2012 JAN三题(1)

USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery combos 输入文件名 gifts.in delivery.in combos.in 输出文件名 gifts.out delivery.out combos.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方式 全文比较 全文比较 全文比

USACO翻译:USACO 2012 JAN三题(2)

USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛跑步 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking baleshare cowrun 输入文件名 stacking.in baleshare.in cowrun.in 输出文件名 stacking.out baleshare.out cowrun.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方

USACO翻译:USACO 2012 FEB Silver三题

USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 游戏组合技 英文题目名称 planting cowids combos 可执行文件名 planting cowids combos 输入文件名 planting.in cowids.in combos.in 输出文件名 planting.out cowids.out combos.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方式 全文比较

POJ3616 Milking Time 【DP】

Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4917   Accepted: 2062 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤

【题解】【数组】【DP】【Codility】Best Time to Buy and Sell Stock

Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1