云计算
题目ID:11067必做题100分
最新提交:
Wrong Answer
0 分
历史最高:
Wrong Answer
10 分时间限制: 3000ms
空间限制: 524288kB题目描述
题目描述
仅一行一个整数,表示能够获得的最大总利润。
样例输入
4
4 2200 700
2 1800 10
20 2550 9999
4 2000 750
3
1 1500 300
6 1900 1500
3 2400 4550样例输出
350
样例解释
数据范围
对于20%的数据,n≤ 15n≤ 15;
对于另外20%的数据,m≤ 15m≤ 15;
对于另外20%的数据,n,m≤ 100,ci=Cj=1n,m≤ 100,ci=Cj=1;
对于另外10%的数据,fi=Fj=1fi=Fj=1;
对于另外10%的数据,vi=Vj=1vi=Vj=1;
对于100%的数据,1≤n≤2×103, 1≤ci,Ci≤50, 1≤fi,Fi,vi,Vi≤1091≤n≤2×103, 1≤ci,Ci≤50, 1≤fi,Fi,vi,Vi≤109
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct computer{
int c,f,v;
}a[4005];
int ct;
int tp;
bool cmp(computer x,computer y){
if(x.f!=y.f){
return x.f>y.f;
}
return x.v<y.v;
}
int dp[200005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].c>>a[i].f>>a[i].v;
a[i].v=-(a[i].v);
tp+=a[i].c;
}
cin>>m;
for(int i=n+1;i<=n+m;i++){
cin>>a[i].c>>a[i].f>>a[i].v;
tp+=a[i].c;
}
memset(dp,-(0x3f3f3f),sizeof(dp));
sort(a+1,a+1+n+m,cmp);
for(int i=1;i<=n+m;i++){
if(a[i].v<0){//卖
for(int j=ct;j>=0;j--){
dp[j+a[i].c]=max(dp[j+a[i].c],dp[j]+a[i].v);
//cout<<"dp["<<j<<"]:"<<dp[j]<<" ";
}
//cout<<endl;
ct+=a[i].c;
}
else{//买
for(int j=0;j<=ct-a[i].c;j++){
dp[j]=max(dp[j],dp[j+a[i].c]+a[i].v);
//cout<<"dp["<<j<<"]:"<<dp[j]<<" ";
}
//cout<<endl;
}
}
/*
for(int i=1;i<=ct;i++){
cout<<dp[i]<<" ";
}
*/
int maxx=-1;
for(int i=0;i<=ct;i++){
maxx=max(maxx,dp[i]);
//cout<<dp[i]<<" ";
}
cout<<maxx;
return 0;
}
/*
*/