考虑01背包,把智商看成体积,情商看成价值。为了处理负数部分,将数组偏移一下。在负数的时候需要注意转移的顺序。
从这道题中的一个小trick,就是求两个数组里选数求最值,可以用背包处理出一个值固定时另一个值的最值。
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=400000,M=800000;
int a[401],b[401],dp[810001];
int main()
{
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> a[i] >> b[i];
}
memset(dp,-0x3f,sizeof(dp));
dp[N]=0;
for (int i=1;i<=n;i++)
{
if (a[i]>0)
{
for (int j=M;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
else
{
for (int j=0;j<=M+a[i];j++) dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
}
}
int ans=0;
for (int i=N;i<=M;i++)
{
if (dp[i]>=0) ans=max(ans,dp[i]+i-N);
}
cout << ans;
return 0;
}
洛谷P2340 Cow Exhibition G 智商情商背包解题思路
该博客介绍了洛谷P2340题目的解法,将问题转化为01背包问题,用智商对应体积,情商对应价值。为了解决负值,对数组进行了偏移处理,并强调在处理负数时转移顺序的重要性。此外,文章提到了一个技巧,如何利用背包策略解决两个数组中选择元素以求固定一个值时另一个值的最大或最小值。
460

被折叠的 条评论
为什么被折叠?



