现在的位置: 首页 > 综合 > 正文

HDU 4504

2013年04月09日 ⁄ 综合 ⁄ 共 604字 ⁄ 字号 评论关闭

昨天晚上腾讯马拉松编程的第一场比赛的最后一题:

昨天晚上没能做出来,看上去感觉是背包不错。但是想破头皮都没有想出来。今天上午发现已经有解题报告了,看了解题报告才知道原来这种算法叫做背包最优方案数。不枉做了一晚上啊,总算是有点收获了。

下面是我AC的代码。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int A, B, t;
    long long f[2][205];
    while(scanf("%d%d%d", &A, &B, &t) != EOF)
    {
        memset(f, 0, sizeof(f));
        int r = t / 15;
        int mid = r / 2;
        r -= mid;
        B += mid;
        int sub = B - A;
        bool k = 0;
        f[0][0] = 1;
        for(int i = 1; i <= r; ++i)
        {
            for(int j = i - 1; j <= (i - 1) * 3; ++j)
            {
                if(f[k][j])
                {
                    f[k ^ 1][j + 1] += f[k][j];
                    f[k ^ 1][j + 2] += f[k][j];
                    f[k ^ 1][j + 3] += f[k][j];
                }
            }
            memset(f[k], 0, sizeof(int) * 205);
            k ^= 1;
        }
        long long ans = 0;
        for(int j = max(r, sub + 1); j <= 3 * r; ++j)
            ans += f[k][j];
        cout << ans << endl;
    }
    return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.