这题目实在太骚。。输入数据各种坑点。。
乘法什么的要转成longlong。。
反正坑点特别多,除掉坑点就是简简单单的DP
#include<iostream>
#include<algorithm>
#include<string.h>
#define ll long long
using namespace std;
int t,n;
long long int f[100001],ans;
struct node
{
int a;
int b;
int c;
}food[100001];
bool comp(node x, node y)
{
return (ll)x.c*(ll)y.b<(ll)y.c*(ll)x.b;
}
void read()
{
int i,j;
std::ios::sync_with_stdio(false);
cin>>t>>n;
for(i=1; i<=n; i++)
cin>>food[i].a;
for(i=1; i<=n; i++)
cin>>food[i].b;
for(i=1; i<=n; i++)
cin>>food[i].c;
sort(food+1,food+n+1,comp);
memset(f,255,sizeof(f));
f[0]=0;
for(i=1; i<=n; i++)
for(j=t-food[i].c; j>=0; j--)
if(f[j]!=-1)
f[j+food[i].c]=max(f[j+food[i].c],f[j]+(ll)food[i].a-(ll)(j+food[i].c)*(ll)(food[i].b));
for(i=0; i<=t; i++)
ans=max(ans,f[i]);
cout<<ans;
return;
}
int main()
{
read();
return 0;
}
AC代码。