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;
}
感叹
为什么我这么菜啊