SMRTFUN

解题思路
首先,我们的陈博同志又成功的找到了原题。(真的NB)
下面正文:
这道题不就是选或不选,然后每只牛只有一只,那不就是01背包吗。我们在聪明程度和有趣程度中选择一个作为体积,另一个作为价值,跑一边就好了,不过因为它有负数,所以我们就将数轴往右移。
code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int s[110],f[110];
int dp[800010];
int ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d%d",&s[i],&f[i]);
memset(dp,-0x3f,sizeof(dp));
dp[400000]=0;
for(int i=1;i<=n;i++)
if(s[i]>=0)
for(int j=800000;j>=s[i];j--)
dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
else
for(int j=0;j<=800000+s[i];j++)
dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
for(int i=400000;i<=800000;i++)
if(dp[i]>=0)
ans=max(ans,dp[i]+i-400000);
cout<<ans<<endl;
}
本文介绍了SMRTFUN题目,通过陈博找到原题后,解析解题思路。该问题转化为01背包问题,以聪明程度或有趣程度为体积和价值,处理负数后进行求解。
193

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



