E 老鹰捉小鸡 - adpc3秋个


题解+代码(搬运)

·非常简单的一个问题。
·首先对于任意一个sum(bi) > n的组合都是不可行的,这个很容易证明,这里就不证了。
·接下来,对于任意一个sum(bi) ≤n的组合都是可行的,不妨将其放在一个环上,并将任意两个相邻标记之间的距离标记成Li,通过鸽笼原理,我们很容易发现,必然存在一个 Li≤bi ,使用它之后,不会少掉组合中任意一个元素。
·后面就很简单了,做一个以n为容量的01背包就好了。

#include <bits/stdc++.h>
using namespace std;

const int N = 40 + 5;
int v[N], w[N], f[N][N];

int main()
{
    int n, m;
    cin >> n;

    for (int i = 1; i <= n; i++)
        cin >> v[i]; // bp
    for (int i = 1; i <= n; i++)
        cin >> w[i]; // ap
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            f[i][j] = f[i - 1][j];
            if (j >= v[i])
                f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
        }
    }
    cout << f[n][n] << endl;
    return 0;
}

感叹

为什么我这么菜啊

posted @ 2021-11-07 13:30  早点跑路远离折磨  阅读(141)  评论(0)    收藏  举报