背包写法,但是和题解不太一样……
将情商看做体积,将智商看做价值。
本题被转化为:求当体积大于等于零时价值与体积的和最大是多少。
由于01背包求的是:当体积小于V的价值最大
所以,考虑将所有物品体积 vi 变成 −vi,然后求出体积小于等于零的最大价值。
但是,由于 vi 有可能出现负数,所以应加上一个偏移量 delta
code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
const int N = 410, delta = 1010;
int n;
int w[N], v[N];
int f[N + 1010];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> w[i] >> v[i], v[i] = -v[i] + delta;
for (int i = 1; i <= n; i ++ )
for (int j = delta; j >= v[i]; j -- )
f[j] = max(f[j], f[j - v[i]] + w[i] - (v[i] - delta));
cout << f[delta] << endl;
return 0;
}