求dalao帮忙看看思路
查看原帖
求dalao帮忙看看思路
519384
Link_Cut_Y楼主2022/2/20 14:15

背包写法,但是和题解不太一样……

将情商看做体积,将智商看做价值。

本题被转化为:求当体积大于等于零时价值与体积的和最大是多少。

由于01背包求的是:当体积小于V的价值最大

所以,考虑将所有物品体积 viv_i 变成 vi-v_i,然后求出体积小于等于零的最大价值。

但是,由于 viv_i 有可能出现负数,所以应加上一个偏移量 deltadelta

code: \texttt{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;
}
2022/2/20 14:15
加载中...