5倍经验日

洛谷P1802 5倍经验日

简单的背包,因为输了也有经验,所以预处理求和,f[i]+=sum,并在此基础上01背包,c[i]为差值,注意赋值时,i0开始,背包的声韵体积可以为0.

#include<bits/stdc++.h>
#define inf 99999999
using namespace std;
void in(long long &x)
{
    long long y=1;
    char c=getchar();x=0;
    while(c<'0'||c>'9')
    {
        if(c=='-')
        y=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
    x*=y;
}
long long n,v;
long long f[1010],c[1010],w[1010];
long long sum;

int main()
{
   in(n),in(v);
   long long x,y;
   for(long long i=1;i<=n;i++)
     {
         in(x),in(y),in(w[i]);
         sum+=x;
         if(y<x)
         {
             c[i]=0;
             w[i]=inf;
         }
         else
         c[i]=y-x;
     }
     for(long long i=0;i<=v;i++)
      {
          f[i]=sum;
      }
  for(long long i=1;i<=n;i++)
     for(long long j=v;j>=w[i];j--)
       f[j]=max(f[j],f[j-w[i]]+c[i]);
  cout<<f[v]*5;
  return 0;
}
原文地址:https://www.cnblogs.com/war1111/p/7388356.html